Как найти основной дескриптор HWND родительского процесса, использующего MFC
У меня есть файл DLL, который работает под родительским программным обеспечением. Родительское программное обеспечение использует MFC и отображает главное окно графического интерфейса. Я хочу создать собственное маленькое немодальное диалоговое окно, которое будет всплывать на экране и находиться рядом с главным окном. Чтобы сделать это, я думаю, что мне нужен HWND главного окна родителя, чтобы я мог найти его RECTangle и затем переместить окно моей DLL туда, где я хочу.
Если это вообще возможно, я бы не хотел менять источник родителя. Как я мог это сделать?
Второй, возможно связанный вопрос, должен ли я использовать MFC или простой Windows API для создания диалогового окна моей DLL. Я хочу, чтобы этот метод был проще, и я прочитал в MSDN, что мне может понадобиться родительское приложение MFC, чтобы отправлять мне сообщения для работы моего MFC, чего я бы предпочел не делать.
3 ответа
Я не знаю, можете ли вы создать dll MFC, который может найти объекты MFC, созданные в другом модуле. Я уверен, что MFC можно использовать для создания диалогов из DLL, независимо от того, используется ли MFC в приложении.
Тем не менее, если вы еще не являетесь экспертом MFC и не хотите им стать, создать диалоговое окно из библиотеки DLL довольно просто. MFC's CDialog действительно тонкая оболочка над CreateDialog, так что вы не получите много.
Я могу придумать как минимум два подхода к поиску окна приложения, если интерфейс app / dll не передает его:
Используйте FindWindow, чтобы найти окно на основе его заголовка или имени класса. Поскольку такие структуры, как MFC, иногда генерируют имена классов окон динамически, это может быть проблематично.
Используйте EnumWindows для перечисления всех окон верхнего уровня. GetWindowThreadProcessId может проверить, принадлежит ли он текущему процессу.
Вызов GetGUIThreadInfo
в основной теме. Это дает вам кучу HWND. Выберите любой действительный (не все значения могут быть заполнены) и найдите его предка верхнего уровня с помощью GetAncestor(GA_ROOT)
, В отличие от EnumWindows
, это не требует перечисления, и в отличие от FindWindow
это не требует специальных знаний
Для получения PID родителя - не HWND - посмотрите на это, что я нашел на http://www.codeexperts.com/showthread.php?1380-get-parent-process-id-from-child-process-id&p=2845&viewfull=1
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 ;
}