2011-01-28 67 views
2

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

如果可能,我想不要更改父项的来源。我怎么能这样做?

第二个可能相关的问题是我是否应该使用MFC或纯windows API来创建我的DLL的对话框。我希望这个方法能够更容易实现,并且我已经阅读了MSDN,可能需要父MFC应用程序向我发送消息以供MFC使用,我宁愿不这样做。

+0

发现可能的重复[如何从DLL中获取HWND?](http://stackoverflow.com/questions/4765692/how-do-i-get-a-hwnd-from-inside-a-dll) – MSalters 2011-01-28 15:36:57

回答

2

我不知道你是否可以创建一个MFC DLL,可以找到在另一个模块中创建的MFC对象。我非常肯定,MFC可以用来从DLL创建对话框,而不管MFC是否在应用程序中使用。这就是说,如果你还不是MFC的专家,并且没有真正希望成为一名专家,那么从dll创建一个对话框非常容易。 MFC的CDialog在CreateDialog上是一个很薄的包装,所以你不会获得太多的收益。

我至少能想到两种方法来寻找应用程序窗口,如果应用程序/ DLL接口不把它交给:基于它的标题,或类名

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

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

2

在主线程上调用GetGUIThreadInfo。这给你一堆HWNDs。选择任何有效的(不是所有的值都可以填写)并找到它的顶级祖先GetAncestor(GA_ROOT)。不像EnumWindows,这并不需要枚举,而不像FindWindow这并不需要专门的知识

+0

谢谢,效果很好! – Scott 2011-01-30 02:15:50

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 ; 
}