[VC++] Закрытие программы: ALT + F4. Активное окно. Фильтрация деактив

Тема в разделе "WASM.WIN32", создана пользователем MuForum, 9 мар 2008.

  1. MuForum

    MuForum Member

    Публикаций:
    0
    Регистрация:
    11 мар 2007
    Сообщения:
    109
    Доброе время суток!
    - И снова я мучаюсь с 'оконной процедурой'.
    - Работаю на '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):
    1. WM_USER + 0 (0x00000400)
    2. WM_USER + 0 (0x00000400)
    3. WM_USER + 0 (0x00000400)
    4. WM_USER + 0 (0x00000400)
    5. WM_USER + 0 (0x00000400)
    6. WM_USER + 0 (0x00000400)
    7. WM_USER + 0 (0x00000400)
    8. WM_USER + 0 (0x00000400)
    9. - wParam: 0x00000284
    10. - lParam: 0x00000001
    11. WM_DISPLAYCHANGE
    12. - wParam: 0x00000020
    13. - lParam: 0x04000500
     
  2. MuForum

    MuForum Member

    Публикаций:
    0
    Регистрация:
    11 мар 2007
    Сообщения:
    109
    # Интересные наблюдения: Я с самого начала думал, что при закрытие какого-либо окну, отправляется системное сообщение об закрытие. Затем когда возникла проблема описанная в данной теме, была мысль(возникло предположение), что наверно отправляется системное сообщение об закрытие всем активным окнам(хотя это даже по логике не правильно).

    - Но следующие эксперементы дали следующий результат:
    # Дополнение: Информация о команде 'WM_SYSCOMMAND': MSDN


    P.S. -> Читал данную статью 'Неснимаемое (неубиваемое) приложение', но в моём случае не подходит, так как окну вообще сообщения о закрытие не приходят.
     
  3. UTeX

    UTeX New Member

    Публикаций:
    0
    Регистрация:
    19 окт 2007
    Сообщения:
    584
    Если все правильно сделано то все должно работать.
    Давай код что написал

    И игру укажи
     
  4. MuForum

    MuForum Member

    Публикаций:
    0
    Регистрация:
    11 мар 2007
    Сообщения:
    109
    Игра 'MuOnline'.
    Графический движек: 'OpenGL'.

    Не знаю парни, может у меня руки кривые хз...
    - Выкладываю свой код:

    # Установка глобального хука вида 'WH_KEYBOARD':
    Код (Text):
    1. if(KeyboardHook == NULL) try{ KeyboardHook = SetWindowsHookEx(WH_KEYBOARD, (HOOKPROC)KeyboardProc, hInstance, 0);} catch(...) {;}
    -
    # Подмена 'оконной процедуры':
    Код (Text):
    1. if(OldWindowProc == NULL && MU_hWnd != NULL)
    2. {
    3.     OldWindowProc = SetWindowLong(MU_hWnd, GWL_WNDPROC, (long)WindowProc);
    4. }
    -
    # Оконная процедура:
    Код (Text):
    1. LRESULT CALLBACK WindowProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
    2. {
    3.     switch(uMsg)
    4.     {    
    5.         case WM_ACTIVATEAPP:
    6.         case WM_ACTIVATE:
    7.         case WM_SETFOCUS:
    8.         case WM_KILLFOCUS:
    9.         {
    10.             return 0;
    11.         }
    12.         break;
    13.         case WM_CLOSE:
    14.         {
    15.             MessageBox(0, "WM_CLOSE", "[WM] Warning!", MB_OK);
    16.             ShowWindow(MU_hWnd, SW_HIDE);
    17.             MU_hWnd = NULL;
    18.             uninstall();
    19.         }
    20.         break;
    21.         default: break;
    22.     }
    23.     return CallWindowProc((WNDPROC)OldWindowProc, hWnd, uMsg, wParam, lParam);
    24. }
    P.S. -> Когда закрываю само окно игры, то сообщения показывается, закрываю другую программу при помощи 'ALT + F4', сообщение не появляется(Spy++ тоже не показывает, чтобы сообщение приходило о закрытие), но окно игры закрывается =(


    # Дополнение: У меня есть 'cesdn.dll', в которой это реализовано, пробовал декомпилить.(Вроде всё перевёл(парни помогли), но полюбому окно закрывается)
    - Если бы кто-то помог мне декомпилить .dll, было супер.
     
  5. Sol_Ksacap

    Sol_Ksacap Миша

    Публикаций:
    0
    Регистрация:
    6 мар 2008
    Сообщения:
    623
    Предположение - в main.exe есть такой код:
    Код (Text):
    1. RegisterHotKey(hwnd_main, 0, MOD_ALT, VK_F4)
    Соответственно, в оконной процедуре отлавливать WM_HOTKEY.
    (!) main.exe не создаёт дополнительное окно специально для регистрации hotkey же?

    И ещё - main.exe ставит глобальный хук SetWindowsHookEx и отлавливает сообщения WM_QUIT | WM_DESTROY | WM_WHATEVER?
     
  6. MuForum

    MuForum Member

    Публикаций:
    0
    Регистрация:
    11 мар 2007
    Сообщения:
    109
    1) На счёт 'RegisterHotKey' - Нет, в коде main.exe не нашел такого.
    2) '(!) main.exe не создаёт ...' - Вроде окно только одно.
    3) 'И ещё - main.exe ставит глобальный ...' - Нет, все сообщения окну приходят только через оконную процедуру.


    P.S. -> Пока никакого прогресса...

    # Результаты тестирования программ WindowMode:
    -
    -
    # Ссылки на архив с 'cesdn.dll':