如何找到MFC的主要HWND句柄
我有一个运行在父级软件下的DLL文件。 父软件使用MFC并显示一个主GUI窗口。 我想要做的是创建我自己的小模式对话框,在屏幕上弹出并坐在主窗口旁边。 要做到这一点,我想我需要父窗口的主窗口的HWND,所以我可以找到它的RECTangle,然后将我的DLL窗口移到我想要的位置。
如果可能的话,我不想改变父母的来源。 我怎么能这样做?
第二个可能相关的问题是我是否应该使用MFC或简单的Windows API来创建我的DLL的对话框。 我希望这个方法能够更容易实现,并且我已经阅读了MSDN,可能需要父MFC应用程序向我发送消息以供MFC使用,我宁愿不这样做。
我不知道你是否可以创建一个能够找到在另一个模块中创建的MFC对象的MFC dll。 我非常肯定,MFC可以用来从DLL创建对话框,而不管MFC是否在应用程序中使用。
也就是说,如果您还不是MFC专家,并且没有真正希望成为一名专家,那么从dll创建对话框非常容易。 MFC的CDialog实际上是CreateDialog的一个小封装,所以你不会获得太多的收益。
如果应用程序/ dll界面没有传递,我至少可以想到两种方法来查找应用程序窗口:
使用FindWindow根据标题或类名来定位窗口。 像MFC这样的框架有时会动态生成窗口类名,这可能会造成问题。
使用EnumWindows枚举所有顶级窗口。 GetWindowThreadProcessId可以测试它是否属于当前进程。
在主线程上调用GetGUIThreadInfo
。 这给你一堆HWNDs。 选择任何有效的(不是所有的值都可以填充)并用GetAncestor(GA_ROOT)
找到它的顶级祖先。 与EnumWindows
不同,这不需要枚举,与FindWindow
不同,这不需要专业知识
为了获得父母的PID - 而不是HWND--请看http://www.codeexperts.com/showthread.php?1380-get-parent-process-id-from-child-process-id&p = 2845&viewfull = 1#post2845
DWORD GetParentProcessID(DWORD dwProcessID)
{
DWORD dwParentProcessID = -1 ;
HANDLE hProcessSnapshot ;
PROCESSENTRY32 processEntry32 ;
hProcessSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0) ;
if(hProcessSnapshot != INVALID_HANDLE_VALUE)
{
processEntry32.dwSize = sizeof(PROCESSENTRY32) ;
if(Process32First(hProcessSnapshot, &processEntry32))
{
do
{
if (dwProcessID == processEntry32.th32ProcessID)
{
dwParentProcessID = processEntry32.th32ParentProcessID ;
break ;
}
}
while(Process32Next(hProcessSnapshot, &processEntry32)) ;
CloseHandle(hProcessSnapshot) ;
}
}
return dwParentProcessID ;
}
链接地址: http://www.djcxy.com/p/41195.html