Come trovare principale manico HWND di MFC-utilizzando processo genitore
Domanda
Ho un file DLL che è in esecuzione sotto un pezzo genitore di software. Il software genitore utilizza MFC e visualizza una finestra GUI principale. Quello che voglio fare è creare la mia finestra non modale di dialogo poco a pop-up sullo schermo e sedersi proprio accanto alla finestra principale. Per fare questo penso di aver bisogno l'HWND della finestra principale del genitore in modo da poter trovare del rettangolo e quindi spostare la mia finestra di DLL a dove voglio.
Se possibile, vorrei non cambiare l'origine del genitore. Come potrei fare questo?
Un secondo, possibilmente correlati, domanda è se dovrei usare MFC, o le finestre semplici API, per creare la finestra di dialogo di mio DLL. Voglio che il metodo che sarà più facile per farlo andare, e ho letto su MSDN che posso avere bisogno di una data applicazione MFC di mandarmi messaggi per il mio MFC al lavoro, che io avrei piuttosto non lo faccio.
Soluzione
Non so se è possibile creare una DLL MFC che può trovare MFC oggetti creati in un altro modulo. Sono abbastanza sicuro che MFC può essere utilizzato per creare finestre di dialogo dal DLL, a prescindere dal fatto che MFC viene utilizzato nell'applicazione.
Detto questo, se non siete già un esperto MFC, e non hanno alcun reale desiderio di diventare uno, la creazione di una finestra di dialogo da una DLL è abbastanza facile. CDialog di MFC è in realtà un involucro sottile sopra CreateDialog in modo da non guadagno molto.
Mi vengono in mente almeno due approcci per trovare la finestra dell'applicazione se l'applicazione / dll interfaccia non consegnarla:
-
FindWindow per individuare la finestra in base al suo titolo, o classname. Come framework come MFC a volte generano classnames finestra dinamicamente questo potrebbe essere problematico.
-
EnumWindows per enumerare tutte le finestre di primo livello. GetWindowThreadProcessId può verificare se appartiene alla corrente processo.
Altri suggerimenti
GetGUIThreadInfo
sul thread principale . In questo modo si ottiene un po 'di HWNDs. Scegliere qualsiasi valida (non tutti i valori possono essere riempiti) e trovare il suo antenato di livello superiore con GetAncestor(GA_ROOT)
. A differenza di EnumWindows
, questo non richiede l'enumerazione, e FindWindow
a differenza di questo non richiede conoscenze specifiche
Per ottenere il PID del genitore - non il HWND - un'occhiata a questo che ho trovato su http://www.codeexperts.com/showthread.php?1380-get-parent-process-id-from-child-process -id & p = 2.845 & 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 ;
}