destiny child

Silver Member | Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору AkulaBig (пост) Цитата: Ну и вот этот цикл принципиально изменен, чтобы знал свой поток. | Ээээ, но когда ищешь при помощи вызова FindWindowEx, то надо "продолжать" поиск А не постоянно вызывать FindWindowEx(NULL, NULL, AppWindowClass, NULL); Должно быть что-то типа такого: Код: // на входе один параметр - идентификатор нового процесса, // что был получен, когда вызывалась функция запуска Ирфана // что в вашем коде прописано как: ProcessInfo.dwProcessId HWND GetProcessWindow(DWORD processId) { bool bFound = false; HWND prevWindow = NULL; wchar_t windowTitle[] = L"IrfanView"; // ну, или что мы там сейчас искать должны // "поймаем" хендл рабочего стола, по идее это полный аналог // передачи параметром NULL в hwndParent в вызове FindWindowEx // но так фигурально точнее ))) HWND desktopWindow = ::GetDesktopWindow(); if (!desktopWindow) break; while (!bFound) { // начинаем поиск на первой итерации и продолжаем его на следующих // за счет того, что используется переменная prevWindow ))) HWND nextWindow = ::FindWindowEx(desktopWindow, prevWindow, AppWindowClass, NULL); if (!nextWindow) break; // наша проверка на то, что найденное окно принадлежит "верному" процессу DWORD procId = -1; ::GetWindowThreadProcessId(nextWindow, &procId); if (procId == processId) { // доп.проверки на то, что окно найдено с нужными параметрами, // в частности это заголовок окна. wchar_t windowText[300]; if (::IsWindowVisible(nextWindow) && !::IsIconic(nextWindow) && ::GetWindowText(nextWindow, (LPWSTR)windowText, sizeof(windowText)/sizeof(wchar_t))) if (windowText == windowTitle) return nextWindow; } // гарантируем, что поиск именно что продолжится! и то, что у него будет конец! т.е. из цикла // мы гарантированно вылетим, т.к. мы точно переберем все окна, что на момент первого вызова // функции FindWindowEx были как бы "заморожены" для процедуры перебора, ведь в милли/нано // секунды выполнения самого поиска в системе могли появиться и другие окна. prevWindow = nextWindow; } return NULL; } |
|