получение HWND для моего собственного приложения в C
Так как я не мог найти ответ на этой вопрос я исследовал немного дальше в MSDN, и я нашел isChild(). Это может дать мне ответ на другой вопрос.
теперь, чтобы использовать isChild () мне нужно передать HWND родительского приложения, которое я хочу проверить, в этом случае мое собственное приложение. Как получить HWND моего собственного приложения?
Я не знаю название, так как он постоянно меняется, поэтому я не могу использовать FindWindow().
спасибо
Edit:
Так как это не ясно, я добавлю больше информации: Я не создаю окно. У меня нет доступа к созданию окна. Мой код-это фрагмент кода, который компилируется вместе с любым приложением, которое кодирует другой программист, и у меня нет доступа к тому, как создается окно, название или любая другая информация. Итак, как мне получить HWND в "окно" приложения, которое я запускаю?
8 ответов
используйте GetTopWindow () и GetNextWindow (), чтобы пройти через windows z-order.
однако не думайте, что это необходимо, но вы можете использовать GetCurrentProcessId () и GetWindowThreadProcessId (), может быть что-то вроде следующего поможет вам:
HWND FindMyTopMostWindow()
{
DWORD dwProcID = GetCurrentProcessId();
HWND hWnd = GetTopWindow(GetDesktopWindow());
while(hWnd)
{
DWORD dwWndProcID = 0;
GetWindowThreadProcessId(hWnd, &dwWndProcID);
if(dwWndProcID == dwProcID)
return hWnd;
hWnd = GetNextWindow(hWnd, GW_HWNDNEXT);
}
return NULL;
}
в вашем приложении нет HWND. Это делает окно. У приложения может не быть окон или их может быть много, поэтому нет общей функции "получить HWND приложения".
очевидное решение - просто держаться за ручку, когда вы ее получите. При создании окна возвращается HWND. Магазин.
предположительно ваш код вызывается основным кодом приложения, иначе какая польза? В этом случае я не понимаю, почему API вашего кода не может включать какой-либо способ информирования Вас о дескрипторе главного окна приложения.
как уже указывали другие
- в общем, приложение может иметь ноль или несколько окон верхнего уровня.
- если вы создаете окно самостоятельно, вы можете просто вспомнить HWND где-то.
но, возможно, ваш код находится в DLL, поэтому вы на самом деле не создали окно верхнего уровня самостоятельно. Так что же делать?
Я бы предложил следующее:
- использовать
EnumWindows
перечислить все окна верхнего уровня. - использовать
GetWindowLongPtr
чтобы получить помеху для каждого окна верхнего уровня. Сравните это с помехой приложения, которое вы можете получить с помощьюGetModuleHandle(NULL)
. Если они идентичны, вы нашли главное окно.
Edit: вот некоторый код. Оказывается, вы также должны использовать IsWindowVisible
потому что, кажется, есть довольно много невидимых "вспомогательных" окон.
HWND hwndMain;
BOOL CALLBACK EnumWindowProc(HWND hwnd, LPARAM lParam)
{
HINSTANCE hinst=(HINSTANCE)GetModuleHandle(NULL);
if((HINSTANCE)GetWindowLongPtr(hwnd, GWL_HINSTANCE)==hinst &&
IsWindowVisible(hwnd))
{
hwndMain=hwnd;
return FALSE;
}
else
return TRUE;
}
тогда в том месте, где вы хотите найти окно:
hwndMain=NULL;
EnumWindows(EnumWindowProc, 0);
и после этого hwndMain
должен содержать ручку окна, или NULL
если нет.
используя EnumWindows
немного обременительно, но рекомендуется по вызову GetWindow
в цикле, потому что, как отмечает MSDN: "приложение, которое вызывает GetWindow для выполнения этой задачи, рискует быть пойманным в бесконечном цикле или ссылаться на дескриптор на окно, которое было уничтожено."
вы можете ввести DLL в поток, который обращается к user32.файл DLL http://msdn.microsoft.com/en-us/library/ms821625.aspx
Это старый для меня, но IIRC вы должны получить HWND в качестве параметра в окне proc. Вы можете сохранить его в глобальной переменной где-то в начале.
Как насчет вашего имени класса windows? Всегда ли это отличается от создания окна? Если нет, вы все еще можете найти FindWindow ().