Доброе время суток! - И снова я мучаюсь с 'оконной процедурой'. - Работаю на 'Visual C++'. (MVS 2005) - Мне необходимо проводить некоторые действия над окном (Отправлять окну сообщения о перемещение и действиях мыши.), но из-за специфики игры, нельзя, чтобы окно получало сообщение о 'дезактивации' (WM_ACTIVATE). - То есть мне приходится делать подмену 'оконной процедуры' и в ней уже фильтровать сообщение 'WM_ACTIVATE'. (Сдесь нет проблем, всё нормально) - Проблема заключается в том, что если во время работы окна, попытаться закрыть другие программы такие как: 'Microsoft Office Word' например, или закрыть какую-либо программу при помощи комбинации клавиш 'Alt + F4', то закрывается и окно игры. - Делать изменения в коде программы main.exe я не могу, то есть мне нужно что-то придумать владея лишь: handle окна, pid, и подменной 'оконной процедурой'. P.S. -> Потратив сутки на поиск в 'google.com' и 'msdn.com' особо ничего не дало. Может у кого-то есть идеи, буду рад. # Добавление: Фильтрация сообщений 'WM_CLOSE' и 'WM_DESTROY' не помогла. # Дополнение: Подробно о сообщение 'WM_ACTIVATE' можно почитать на следующих ресурсах: MSDN, firststeps.ru. # Результат использования 'WinSpector' - Последние десять сообщений перед закрытием окна после использования комбинации клавиш 'ALT + F4'. Код (Text): WM_USER + 0 (0x00000400) WM_USER + 0 (0x00000400) WM_USER + 0 (0x00000400) WM_USER + 0 (0x00000400) WM_USER + 0 (0x00000400) WM_USER + 0 (0x00000400) WM_USER + 0 (0x00000400) WM_USER + 0 (0x00000400) - wParam: 0x00000284 - lParam: 0x00000001 WM_DISPLAYCHANGE - wParam: 0x00000020 - lParam: 0x04000500
# Интересные наблюдения: Я с самого начала думал, что при закрытие какого-либо окну, отправляется системное сообщение об закрытие. Затем когда возникла проблема описанная в данной теме, была мысль(возникло предположение), что наверно отправляется системное сообщение об закрытие всем активным окнам(хотя это даже по логике не правильно). - Но следующие эксперементы дали следующий результат: # Дополнение: Информация о команде 'WM_SYSCOMMAND': MSDN P.S. -> Читал данную статью 'Неснимаемое (неубиваемое) приложение', но в моём случае не подходит, так как окну вообще сообщения о закрытие не приходят.
Игра 'MuOnline'. Графический движек: 'OpenGL'. Не знаю парни, может у меня руки кривые хз... - Выкладываю свой код: # Установка глобального хука вида 'WH_KEYBOARD': Код (Text): if(KeyboardHook == NULL) try{ KeyboardHook = SetWindowsHookEx(WH_KEYBOARD, (HOOKPROC)KeyboardProc, hInstance, 0);} catch(...) {;} - # Подмена 'оконной процедуры': Код (Text): if(OldWindowProc == NULL && MU_hWnd != NULL) { OldWindowProc = SetWindowLong(MU_hWnd, GWL_WNDPROC, (long)WindowProc); } - # Оконная процедура: Код (Text): LRESULT CALLBACK WindowProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { switch(uMsg) { case WM_ACTIVATEAPP: case WM_ACTIVATE: case WM_SETFOCUS: case WM_KILLFOCUS: { return 0; } break; case WM_CLOSE: { MessageBox(0, "WM_CLOSE", "[WM] Warning!", MB_OK); ShowWindow(MU_hWnd, SW_HIDE); MU_hWnd = NULL; uninstall(); } break; default: break; } return CallWindowProc((WNDPROC)OldWindowProc, hWnd, uMsg, wParam, lParam); } P.S. -> Когда закрываю само окно игры, то сообщения показывается, закрываю другую программу при помощи 'ALT + F4', сообщение не появляется(Spy++ тоже не показывает, чтобы сообщение приходило о закрытие), но окно игры закрывается =( # Дополнение: У меня есть 'cesdn.dll', в которой это реализовано, пробовал декомпилить.(Вроде всё перевёл(парни помогли), но полюбому окно закрывается) - Если бы кто-то помог мне декомпилить .dll, было супер.
Предположение - в main.exe есть такой код: Код (Text): RegisterHotKey(hwnd_main, 0, MOD_ALT, VK_F4) Соответственно, в оконной процедуре отлавливать WM_HOTKEY. (!) main.exe не создаёт дополнительное окно специально для регистрации hotkey же? И ещё - main.exe ставит глобальный хук SetWindowsHookEx и отлавливает сообщения WM_QUIT | WM_DESTROY | WM_WHATEVER?
1) На счёт 'RegisterHotKey' - Нет, в коде main.exe не нашел такого. 2) '(!) main.exe не создаёт ...' - Вроде окно только одно. 3) 'И ещё - main.exe ставит глобальный ...' - Нет, все сообщения окну приходят только через оконную процедуру. P.S. -> Пока никакого прогресса... # Результаты тестирования программ WindowMode: - - # Ссылки на архив с 'cesdn.dll':