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

cm2004 2012-04-06 12:26:11
代码都是一样的:

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


另:本帖拒绝小蓝鸟贵薪回帖
...全文
177 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
s11ss 2012-04-06
  • 打赏
  • 举报
回复
MainForm.Handle不会,因为它是只读属性,线程操作它都是读嘛,哪儿来线程安全一说?[Quote=引用 10 楼 的回复:]
h := GetWindow(Handle, GW_HWNDFIRST);
把这句放在线程中的话,Handle表示是线程的句柄,而不是窗体Form1的!

比较好的方法是将MainForm.Handle当成能参数传入线程。
当然,如果你能保证其它线程不会操作MainForm.Handle,也可以直接在这个线程中操作它。但是不怕一万就怕万一,也许你今天写程序时,只有一个线程会操作MainFo……
[/Quote]
cdchq 2012-04-06
  • 打赏
  • 举报
回复
h := GetWindow(Handle, GW_HWNDFIRST);
把这句放在线程中的话,Handle表示是线程的句柄,而不是窗体Form1的!

比较好的方法是将MainForm.Handle当成能参数传入线程。
当然,如果你能保证其它线程不会操作MainForm.Handle,也可以直接在这个线程中操作它。但是不怕一万就怕万一,也许你今天写程序时,只有一个线程会操作MainForm.Handle,但明天你突然又想加入另一个线程,也想操作MainForm.Handle,就会引起线程安全问题
s11ss 2012-04-06
  • 打赏
  • 举报
回复
其实在线程中直接读Form1.Handle或读写Form1.Tag(假设其他线程不操作Tag)等这些简单的属性是没有多大问题的[Quote=引用 4 楼 的回复:]
不要在线程中直接訪問Form1.Handle
而是把Form1.Handle当以参数形式传入线程里面去使用
[/Quote]
cm2004 2012-04-06
  • 打赏
  • 举报
回复
不要在线程直接引用如From1.Handle类似的东西

嗯。这个我知道的,要用同步,我这里只是方便写所以写成这样的
nm_wyh 2012-04-06
  • 打赏
  • 举报
回复
【还有就是不要在线程直接引用如From1.Handle类似的东西】是四楼说的!看错了,不好意思四楼的仁兄!
nm_wyh 2012-04-06
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 的回复:]
h := GetWindow(Handle, GW_HWNDFIRST);
把这句放在线程中的话,Handle表示是线程的句柄,而不是窗体Form1的!
[/Quote]
这个正确,还有就是不要在线程直接引用如From1.Handle类似的东西。如三楼所说,会造成程序崩溃的!
用一个公用变量,或者是当做一个参数传递进去就可以了!
iamduo 2012-04-06
  • 打赏
  • 举报
回复
那用
Application.MainFormHandle
试试。
kaikai_kk 2012-04-06
  • 打赏
  • 举报
回复
不要在线程中直接訪問Form1.Handle
而是把Form1.Handle当以参数形式传入线程里面去使用
山东蓝鸟贵薪 2012-04-06
  • 打赏
  • 举报
回复
学习中
....................
s11ss 2012-04-06
  • 打赏
  • 举报
回复
h := GetWindow(Handle, GW_HWNDFIRST);
把这句放在线程中的话,Handle表示是线程的句柄,而不是窗体Form1的!
山东蓝鸟贵薪 2012-04-06
  • 打赏
  • 举报
回复
帮顶帖子中
我............

1,184

社区成员

发帖
与我相关
我的任务
社区描述
Delphi Windows SDK/API
社区管理员
  • Windows SDK/API社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧