程序内新建模式对话框的句柄查找问题
来源:互联网 发布:acl 源 mac 目的ip 编辑:程序博客网 时间:2024/05/29 18:39
这里记录一个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)。问题迎刃而解。
- 程序内新建模式对话框的句柄查找问题
- 请教一个获取对话框句柄的问题
- Perl 循环内没关闭文件句柄引发的问题
- 通过程序名称查找窗口句柄
- 查找特定窗口的句柄
- 获得程序的句柄
- 使程序不在 Ctrl+Alt+Del 弹出的对话框内
- 多线程程序退出内存句柄泄漏的问题以及解决方法
- 新建一个基于对话框的MFC程序, 按空格键发现程序退出。
- 简单的win32对话框程序 c++ vc6.0 模式对话框 非模式对话框
- MFC中对话框控件的句柄和设备上下文的问题
- 第四章 查找记事本程序的窗口句柄 windows程序设计 王艳平版
- 如何使用VC对话框的句柄
- 如何获得主对话框的句柄
- 解决对话框内工具栏对象无法响应ON_UPDATE_COMMAND_UI的问题
- 查找标题已知的窗口句柄,遍历窗口控件句柄
- 查找标题已知的窗口句柄,遍历窗口控件句柄
- MFC 自定义子线程新建对话框的数据传输问题 -- 以及由此对MFC的一些思考
- C++语言的dll生成与使用
- C++ 语言基础(1)
- 单链表逆置
- Google编码规范
- [VC] 设置系统时间
- 程序内新建模式对话框的句柄查找问题
- C++虚函数表深入解析 (一)
- ajax get方式请求
- 经典算法研究系列:二、Dijkstra 算法初探
- R语言之关联规则挖掘
- Wall(凸包POJ 1113)
- android button 的clickable 和 enable属性的个人见解
- 机器学习中的范数规则化:L0、L1与L2范数,核范数和规则项参数选择
- 快速排序