如何查找MFC使用父进程的主HWND句柄

时间:2011-01-28 03:47:17

标签: winapi dll mfc hwnd

我有一个在父软件下运行的DLL文件。父软件使用MFC并显示主GUI窗口。我想要做的是创建我自己的小模式对话框,弹出屏幕并坐在主窗口旁边。要做到这一点,我认为我需要父窗口的HWND,所以我可以找到它的RECTangle,然后将我的DLL窗口移动到我想要的位置。

如果可能的话,我不想改变父母的来源。我怎么能这样做?

第二个可能相关的问题是我是应该使用MFC还是普通的Windows API来创建我的DLL对话框。我想要更容易实现的方法,并且我已经在MSDN上阅读了我可能需要父MFC应用程序向我发送消息以供我的MFC工作,我宁愿不这样做。

3 个答案:

答案 0 :(得分:2)

我不知道你是否可以创建一个可以找到在另一个模块中创建的MFC对象的MFC dll。我很确定MFC可用于从DLL创建对话框,无论是否在应用程序中使用MFC。

那就是说,如果你还不是MFC专家,并且没有真正希望成为一个,那么从dll创建一个对话框非常容易。 MFC的CDialog实际上比CreateDialog更薄,所以你获得的收益不多。

如果app / dll界面没有提交应用程序窗口,我至少可以想到找到应用程序窗口的两种方法:

  • 使用FindWindow根据标题或类名定位窗口。由于像MFC这样的框架有时会动态生成窗口类名,这可能会有问题。

  • 使用EnumWindows枚举所有顶级窗口。 GetWindowThreadProcessId可以测试它是否属于当前流程。

答案 1 :(得分:2)

在主线程上调用GetGUIThreadInfo。这会让你获得一堆HWND。选择任何有效的(不是所有值都可以填充)并找到其GetAncestor(GA_ROOT)的顶级祖先。与EnumWindows不同,这不需要枚举,与FindWindow不同,这不需要专业知识

答案 2 :(得分:0)

为了获得父亲的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 ;
}