为什么我在线程里使用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)等这些简单的属性是没有多大问题的
[解决办法]
h := GetWindow(Handle, GW_HWNDFIRST);
把这句放在线程中的话,Handle表示是线程的句柄,而不是窗体Form1的!
比较好的方法是将MainForm.Handle当成能参数传入线程。
当然,如果你能保证其它线程不会操作MainForm.Handle,也可以直接在这个线程中操作它。但是不怕一万就怕万一,也许你今天写程序时,只有一个线程会操作MainForm.Handle,但明天你突然又想加入另一个线程,也想操作MainForm.Handle,就会引起线程安全问题