2011-01-28 69 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 ; 
}