Как найти основной дескриптор HWND родительского процесса, использующего MFC - PullRequest
2 голосов
/ 28 января 2011

У меня есть файл DLL, который работает под родительским программным обеспечением. Родительское программное обеспечение использует MFC и отображает главное окно графического интерфейса. Я хочу создать собственное маленькое немодальное диалоговое окно, которое будет всплывать на экране и находиться рядом с главным окном. Чтобы сделать это, я думаю, что мне нужен HWND главного окна родителя, чтобы я мог найти его RECTangle и затем переместить окно моей DLL туда, где я хочу.

Если это вообще возможно, я бы не хотел менять источник родителя. Как я мог это сделать?

Второй, возможно связанный вопрос, должен ли я использовать MFC или простой Windows API для создания диалогового окна моей DLL. Я хочу, чтобы этот метод был проще, и я прочитал в MSDN, что мне может понадобиться родительское приложение MFC, чтобы отправлять мне сообщения для работы моего MFC, чего я бы предпочел не делать.

Ответы [ 3 ]

2 голосов
/ 28 января 2011

Звоните GetGUIThreadInfo в основном потоке. Это дает вам кучу HWND. Выберите любой действительный (не все значения могут быть заполнены) и найдите его предка верхнего уровня с GetAncestor(GA_ROOT). В отличие от EnumWindows, это не требует перечисления, и в отличие от FindWindow это не требует специальных знаний

2 голосов
/ 28 января 2011

Я не знаю, можете ли вы создать dll MFC, который может находить объекты MFC, созданные в другом модуле. Я почти уверен, что MFC можно использовать для создания диалогов из DLL, независимо от того, используется ли MFC в приложении.

Тем не менее, если вы еще не являетесь экспертом MFC и не хотите им стать, создать диалоговое окно из библиотеки DLL довольно просто. MFC's CDialog - действительно тонкая оболочка над CreateDialog , поэтому вы не получите много.

Я могу придумать как минимум два подхода к поиску окна приложения, если интерфейс app / dll не передает его:

  • Используйте FindWindow , чтобы найти окно на основе его заголовка или имени класса. Поскольку такие структуры, как MFC, иногда генерируют имена классов окон динамически, это может быть проблематично.

  • Используйте EnumWindows для перечисления всех окон верхнего уровня. GetWindowThreadProcessId может проверить, принадлежит ли он текущему процессу.

0 голосов
/ 16 января 2013

Для получения 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 ;
}
...