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.

È stato utile?

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 ;
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top