一、问题由来及说明
在实际编程中遇到一些系统模块(或API)调用初始化需要窗口句柄,在主程序中(MFC或者win32)都可以很容易获得,比如mfc中可以直接调用AfxGetMainWnd()、GetSafeHwnd()获取窗口句柄。但是如果跨DLL调用就很难拿到主程序的窗口句柄,那么如何获取呢?
二、可用的方法介绍
1. FindWindow/FindWindowEx函数
如果知道主调程序的进程名称,可以用FindWindow枚举并查找系统运行的所有窗口函数。
该函数之所以可以运行,是因为windows下HWND是全局的,在系统中是唯一的。
有一个缺点,如果主调程序运行多个实例的话,FindWindow基本上是无能为力的,是无法区分那个实例的。
2. EnumWindows函数
如果能够获取当前的进程pid(通常调用GetCurrentProcessId函数),可以通过EnumWindows枚举当前系统中所有的窗口函数,然后遍历。调用GetWindowThreadProcessId函数,可以将EnumWindows的回调的HWND转换为进程pid。这样就可以精确定位了。
当然,也可以使用FindWindow函数。
3. GetGUIThreadInfo函数
上面两个方法都是i需要遍历系统中所有窗口的,这个函数可以直接通过线程pid获取主窗口句柄,感兴趣的可以查看下msdn。
https://msdn.microsoft.com/en-us/library/ms633506(v=vs.85).aspx
说明下:博客很久没写了。还是比较倾向于解答问题的方式,直观,也认识到自己成长的脚步。所以以后有什么问题都会及时记录与更新。内容可能会很短,只有基本的思路。实际编码可以后续深入探讨下。
------------------------
成长的路,披荆斩棘,无所畏惧。
本文是由Tocy撰写整理,有问题欢迎评论及邮件。转载请注明原文地址。