destiny child

Silver Member | Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору AkulaBig (пост) Цитата: А поймать это окно не легко. | Код: #include <Windows.h> // Определите функцию обратного вызова, которая будет вызываться при возникновении события оболочки. LRESULT CALLBACK ShellProc(int nCode, WPARAM wParam, LPARAM lParam) { // Проверьте, является ли событие оболочки уничтожением окна. if (nCode == HSHELL_WINDOWDESTROYED) { HWND hwnd = (HWND)wParam; // TODO: Проверьте, нужное ли это окно, и примите соответствующие меры. } // Вызвать следующий хук в цепочке return CallNextHookEx(NULL, nCode, wParam, lParam); } int main() { // Установка хука HHOOK hHook = SetWindowsHookEx(WH_SHELL, ShellProc, NULL, 0); // TODO: то что надо делаем... // Удаление хука, после всех работ UnhookWindowsHookEx(hHook); return 0; } | Да, у способа есть ограничение, что на самом деле он не совсем про процесс удаления, а скорее про процесс «окно верхнего уровня не может отображаться на панели задач». Может в теории того - КАК вы скрываете окно Ирфана - оно будет вызываться и с ложным результатом, но с этого можно начать)) На крайняк может типа такого кода использовать: Код: #include <Windows.h> #include <iostream> static bool bStopMonitoring = false; DWORD WINAPI MonitorProcess(LPVOID lpParam) { DWORD dwWaitResult; HANDLE hProcess = reinterpret_cast<HANDLE>(lpParam); do { dwWaitResult = WaitForSingleObject(hProcess, 100); } while (!bStopMonitoring && dwWaitResult == WAIT_TIMEOUT); DWORD dwExitCode; GetExitCodeProcess(hProcess, &dwExitCode); PostThreadMessage(GetCurrentThreadId(), WM_USER, dwExitCode, 0); CloseHandle(hProcess); return 0; } int main() { DWORD dwProcessId = 12345; // тут мы вставляем идентификатор запущенного нами процесса Ирфана HANDLE hProcess = OpenProcess(PROCESS_QUERY_INFORMATION | SYNCHRONIZE, FALSE, dwProcessId); if (hProcess == NULL) { std::cout << "Could not open process." << std::endl; return 1; } DWORD dwThreadId; // готовим "детектива" слежки за подопечным.... HANDLE hThread = CreateThread(NULL, 0, MonitorProcess, hProcess, 0, &dwThreadId); MSG msg; // эмулируем как бы основной цикл обработки сообщений GUI плагина while (GetMessage(&msg, NULL, 0, 0)) { if (msg.message == WM_USER) // это наше особое сообщение от "детектива" { DWORD dwExitCode = static_cast<DWORD>(msg.wParam); std::cout << "Process terminated with exit code: " << dwExitCode << std::endl; break; } TranslateMessage(&msg); DispatchMessage(&msg); } bStopMonitoring = true; CloseHandle(hThread); return 0; } |
|