2

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

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

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

4

3 回答 3

2

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

也就是说,如果您还不是 MFC 专家,并且没有真正的愿望,那么从 dll 创建一个对话框非常容易。MFC 的 CDialog 实际上是CreateDialog的一个薄包装器,因此您不会获得太多收益。

如果 app/dll 接口不交给它,我至少可以想到两种方法来查找应用程序窗口:

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

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

于 2011-01-28T07:17:50.777 回答
2

调用GetGUIThreadInfo主线程。这会为您带来一堆 HWND。选择任何一个有效的(不是所有的值都可以填写)并找到它的顶级祖先GetAncestor(GA_ROOT)。不像EnumWindows,这不需要枚举,不像FindWindow这不需要专业知识

于 2011-01-28T15:19:54.023 回答
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 ;
}
于 2013-01-16T12:34:40.110 回答