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

Winapi 如何使用父进程查找MFC的主HWND句柄,winapi,dll,mfc,hwnd,Winapi,Dll,Mfc,Hwnd,我有一个DLL文件,它在父软件下运行。父软件使用MFC并显示一个主GUI窗口。我想做的是创建我自己的小无模式对话框,在屏幕上弹出,并坐在主窗口旁边。要做到这一点,我想我需要父窗口的HWND,这样我就可以找到它的矩形,然后将我的DLL窗口移动到我想要的地方 如果可能的话,我不想更改父对象的源。我怎么能这样做 第二个可能相关的问题是,我是否应该使用MFC或普通windows API来创建DLL对话框。我想要一种更容易使用的方法,我在MSDN上读到,我可能需要父MFC应用程序向我发送消息,让我的MFC

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

如果可能的话,我不想更改父对象的源。我怎么能这样做


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

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

这就是说,如果您还不是MFC专家,也没有成为MFC专家的真正愿望,那么从dll创建对话框是非常容易的。MFC的CDialog实际上是一个薄薄的包装,所以您不会获得太多

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

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

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


    • 调用主线程。这会给你带来很多麻烦。选择任何有效的一个(并非所有值都可以填充),并使用
      get祖先(GA_ROOT)
      查找其顶级祖先。与
      EnumWindows
      不同,这不需要枚举,与
      FindWindow
      不同,这不需要专门知识

      来获取父级的PID(而不是HWND),请看我在

      可能重复的
      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 ;
      }