程序内新建模式对话框的句柄查找问题

来源:互联网 发布:acl 源 mac 目的ip 编辑:程序博客网 时间:2024/05/29 18:39

利用spy++查找对话框的类名、窗口名,然后FindWindow,FindWindowEx得到句柄,发送相应的消息,就是一个模拟人的操作的基本步骤。

这里记录一个windows的bug(不知道算不算bug,也许是特性??反正找了半天才解决这个问题)

在程序内如果点击Fild->Open会新建一个模式对话框,用spy++查找可以看到父窗口就是程序的主窗口,然后这时候会发现有两个问题:

1、从主窗口找子窗口,然后一个一个的枚举下去是不能找到这个窗口的

2、利用FindWindowEx,不管你怎么搭配参数也是找不到这个窗口的(MAKERESOUREATOM, class name,window name)


后来我明白了:

1、主窗口是这个模式对话框的父窗口,但是模式对话框却不是主窗口的子窗口(也就是单向关系)

2、要想查找这个窗口要用FindWindow,也就是说模式对话框实际是一个top-level的窗口


具体的代码如下

do {hwndLoad = FindWindow(L"#32770", NULL);if (GetParent(hwndLoad) == hwndRoot)break;elsehwndLoad = GetWindow(hwndLoad, GW_HWNDNEXT);} while (hwndLoad);

#32770是模式对话框的类名,首先FindWindow得到第一个模式对话框的句柄,然后依次枚举每一个句柄,直到那个句柄的父句柄是程序的主窗口句柄,就退出。


--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------


8.28更新,上面说的不完全正确,我后来才发现了真正的问题。

首先有几点还是正确的1.dialog这个#32770类的窗口的父窗口是程序的主窗口,但是程序的主窗口的子窗口却没有这个dialog的窗口,换句话说,他们是单向的父子关系

2.因此我们要查找这个窗口就得用FindWindow,而且不用上面那么复杂的代码(而且上面的代码也写错了,循环里面每次都重新FindWindow了)

3.正确又简单的写法就是HWND hwndLoad = FindWindow("#32770", "Load");// Load是窗口的名称。


那么为什么有时候找不到这个窗口呢,原因出在PostMessage这个函数身上,这函数直接把消息递给消息队列就回来了,然而窗口的初始化需要一定的时间,这个时候dialog窗口还在初始化,FindWindow怎么可能找得到呢,所以说我的解决方法就是Sleep(500)。问题迎刃而解。

0 0
原创粉丝点击