Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 30.03.2008, 16:49   #1
MuForum
 
Регистрация: 30.03.2008
Сообщений: 5
Вопрос [VC++] Закрытие программы: ALT + F4. Активное окно. Фильтрация деактив

Доброе время суток!
- И снова я мучаюсь с 'оконной процедурой'.
- Работаю на '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'.

Код:
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
MuForum вне форума Ответить с цитированием
Старый 30.03.2008, 16:49   #2
MuForum
 
Регистрация: 30.03.2008
Сообщений: 5
По умолчанию

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

- Но следующие эксперементы дали следующий результат:
Цитата:
При закрытие окна игры при помощи кнопки 'Закрыть/Close' (SystemMenu), окну приходит два сообщения в следующем порядке: 'WM_CLOSE' -> 'WM_DESTROY'.

При закрытие окна игры при помощи комбинации клавиш 'ALT + F4', окну приходит два сообщения в следующем порядке: 'WM_CLOSE' -> 'WM_DESTROY'.

При закрытие любого другого окна при помощи комбинации клавиш 'ALT + F4', окно игры закрывается, но не одно из следующих сообщение не приходит: 'WM_CLOSE', 'WM_DESTROY', 'WM_NCDESTROY', 'WM_QUIT'.
# Дополнение: Информация о команде 'WM_SYSCOMMAND': MSDN


P.S. -> Читал данную статью 'Неснимаемое (неубиваемое) приложение', но в моём случае не подходит, так как окну вообще сообщения о закрытие не приходят.
MuForum вне форума Ответить с цитированием
Старый 30.03.2008, 16:50   #3
MuForum
 
Регистрация: 30.03.2008
Сообщений: 5
По умолчанию

Игра 'MuOnline'.
Графический движек: 'OpenGL'.

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

# Установка глобального хука вида 'WH_KEYBOARD':
Код:
if(KeyboardHook == NULL) try{ KeyboardHook = SetWindowsHookEx(WH_KEYBOARD, (HOOKPROC)KeyboardProc, hInstance, 0);} catch(...) {;}
-
# Подмена 'оконной процедуры':
Код:
if(OldWindowProc == NULL && MU_hWnd != NULL)
{
    OldWindowProc = SetWindowLong(MU_hWnd, GWL_WNDPROC, (long)WindowProc);
}
-
# Оконная процедура:
Код:
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, было супер.
MuForum вне форума Ответить с цитированием
Старый 30.03.2008, 16:51   #4
MuForum
 
Регистрация: 30.03.2008
Сообщений: 5
По умолчанию

# Результаты тестирования программ WindowMode других ребят:
Цитата:
Travis_Minimizer - Отрицательный. (Окно закрылось)
SkyTeam WindowMode - Отрицательный. (Окно закрылось)
Mupie Minimizer - Отрицательный. (Окно закрылось)
Minimizer by lodi - Отрицательный. (Окно закрылось)
MU Window by gk2002(cesdn) - Положительный. (Окно не закрывается) -> Это единственный WindowMode, который не закрывает окно. (Написал его этот парень ещё в конце 2003 года, у меня есть незапакованная его 'cesdn.dll', Но как не пробовал декомпилировать, как не помогали, полюбому окно закрывается)
-
-
# Ссылки на архив с 'cesdn.dll':
Цитата:
RapidShare.com: Download
zShare.Net: Download
slil.ru: Download
MuForum вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Закрытие программы Zloy_Doomer Общие вопросы Delphi 3 23.06.2008 19:08
Активное окно Messir_Leonard Win Api 4 22.04.2008 19:25
Активное окно MadReason Win Api 12 10.01.2008 17:44
Предыдущее активное окно martinz Win Api 3 25.11.2007 15:02
Запрет на закрытие программы John_chek Общие вопросы Delphi 2 04.05.2007 11:39