读书人

为什么小弟我在线程里使用GetWindow跟

发布时间: 2012-04-20 15:27:03 作者: rapoo

为什么我在线程里使用GetWindow跟在主线程里使用时得出的结果不一样呢?
代码都是一样的:

Delphi(Pascal) code
procedure TForm1.Button1Click(Sender: TObject);var  h: HWnd;  p: array[0..254] of char;begin  h := GetWindow(Handle, GW_HWNDFIRST);  while h <> 0 do  begin    if GetWindowText(h, p, 255) > 0 then Form1.Memo1.Lines.Add(p);    h := GetWindow(h, GW_HWNDNEXT);  end;end;



在主线程里运行得出的结果是正常的,但是在其他线程里运行得出的结果不正确
我的IDE是XE2 UP4


另:本帖拒绝小蓝鸟贵薪回帖

[解决办法]
那用
Application.MainFormHandle
试试。
[解决办法]
【还有就是不要在线程直接引用如From1.Handle类似的东西】是四楼说的!看错了,不好意思四楼的仁兄!
[解决办法]
其实在线程中直接读Form1.Handle或读写Form1.Tag(假设其他线程不操作Tag)等这些简单的属性是没有多大问题的
探讨
不要在线程中直接Form1.Handle
而是把Form1.Handle当以参数形式传入线程里面去使用

[解决办法]
h := GetWindow(Handle, GW_HWNDFIRST);
把这句放在线程中的话,Handle表示是线程的句柄,而不是窗体Form1的!

比较好的方法是将MainForm.Handle当成能参数传入线程。
当然,如果你能保证其它线程不会操作MainForm.Handle,也可以直接在这个线程中操作它。但是不怕一万就怕万一,也许你今天写程序时,只有一个线程会操作MainForm.Handle,但明天你突然又想加入另一个线程,也想操作MainForm.Handle,就会引起线程安全问题

读书人网 >.NET

热点推荐