如何找到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

    上一篇: How to find main HWND handle of MFC

    下一篇: Android issue with Tab initialization