Модераторы: feodorv, GremlinProg, xvr, Fixin

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [VC++] Закрытие программы: ALT + F4, Активное окно. Фильтрация деактивации. 
:(
    Опции темы
MuForum
  Дата 7.3.2008, 00:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 427
Регистрация: 13.6.2007
Где: Молдова, Кишинев

Репутация: нет
Всего: 4



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

Это сообщение отредактировал(а) MuForum - 7.3.2008, 00:52


--------------------
"Чтобы правильно задать вопрос, нужно знать большую часть ответа!" (Р. Шекли)
PM MAIL WWW ICQ Skype MSN   Вверх
586
Дата 7.3.2008, 00:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2243
Регистрация: 8.5.2006

Репутация: 39
Всего: 146



Пробывал перехватывать WM_CLOSE?
PM   Вверх
MuForum
Дата 7.3.2008, 00:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 427
Регистрация: 13.6.2007
Где: Молдова, Кишинев

Репутация: нет
Всего: 4



Цитата(586 @ 7.3.2008,  00:22)
Пробывал перехватывать WM_CLOSE?

Код

LRESULT CALLBACK WindowProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
    switch(uMsg)
    {
        case WM_CLOSE:
        case WM_DESTROY:
        {
            return DefWindowProc(hWnd, uMsg, wParam, lParam);
        }
        break;
        default: break;
    }
    return CallWindowProc((WNDPROC)NewWindowProc, hWnd, uMsg, wParam, lParam);
}


- К сожалению не помогло...

Это сообщение отредактировал(а) MuForum - 7.3.2008, 00:27


--------------------
"Чтобы правильно задать вопрос, нужно знать большую часть ответа!" (Р. Шекли)
PM MAIL WWW ICQ Skype MSN   Вверх
586
Дата 7.3.2008, 00:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2243
Регистрация: 8.5.2006

Репутация: 39
Всего: 146



Нам надо вернуть 0 или 1 (непомню) и не вызывать DefWindowProc.

Это сообщение отредактировал(а) 586 - 7.3.2008, 00:32
PM   Вверх
MuForum
Дата 7.3.2008, 00:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 427
Регистрация: 13.6.2007
Где: Молдова, Кишинев

Репутация: нет
Всего: 4



Цитата(586 @ 7.3.2008,  00:31)
Нам надо вернуть 0 или 1 (непомню) и не вызывать DefWindowProc.

Сейчас попробую и в этом сообщение ниже напишу результат.

# Результат: Попробовал и '0' и '1', результат отрицательный =(
- При закрытие любого другого окна при помощи 'ALT + F4', закрывается и окно игры =(

Это сообщение отредактировал(а) MuForum - 7.3.2008, 00:49


--------------------
"Чтобы правильно задать вопрос, нужно знать большую часть ответа!" (Р. Шекли)
PM MAIL WWW ICQ Skype MSN   Вверх
586
Дата 7.3.2008, 00:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2243
Регистрация: 8.5.2006

Репутация: 39
Всего: 146



Посмотри, что показывает Spy++. Попробуй перехватить WM_NCDESTROY.
PS: Может игра из-за ошибки закрывается?
PM   Вверх
MuForum
Дата 7.3.2008, 01:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 427
Регистрация: 13.6.2007
Где: Молдова, Кишинев

Репутация: нет
Всего: 4



Цитата(586 @ 7.3.2008,  00:55)
Посмотри, что показывает Spy++. Попробуй перехватить WM_NCDESTROY.
PS: Может игра из-за ошибки закрывается?

На счёт команды: 'WM_NCDESTROY' - сейчас попробую и отпишусь.
На счёт закрытия: Нет, с игре всё нормально. Игра закрывается из-за того, что мне необходимо фильтровать сообщение о дезактивации, то есть окно для системы постоянно является активно. А при использование комбинации клавиш 'ALT + F4', отправляется системное сообщение всем активным окнам о закрытие(На сколько я знаю и на сколько я заметил).

Добавлено @ 01:10
Код

LRESULT CALLBACK WindowProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
    switch(uMsg)
    {
        case WM_CLOSE:
        case WM_DESTROY:
        case WM_NCDESTROY:
        {
            return 0/1;
        }
        break;
        case WM_ACTIVATE:
        {
            if(LOWORD(wParam) == WA_INACTIVE) return DefWindowProc(hWnd, uMsg, wParam, lParam);
        }
        break;
        default: break;
    }
    return CallWindowProc((WNDPROC)NewWindowProc, hWnd, uMsg, wParam, lParam);
}


- Пробовал использовать '0' и '1', результат отрицательный... =(


# Дополнение: Сейчас скачаю WinSpector и напишу результат. (Screen)

Это сообщение отредактировал(а) MuForum - 7.3.2008, 01:15


--------------------
"Чтобы правильно задать вопрос, нужно знать большую часть ответа!" (Р. Шекли)
PM MAIL WWW ICQ Skype MSN   Вверх
MuForum
Дата 7.3.2008, 01:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 427
Регистрация: 13.6.2007
Где: Молдова, Кишинев

Репутация: нет
Всего: 4



# Результат использования '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 



--------------------
"Чтобы правильно задать вопрос, нужно знать большую часть ответа!" (Р. Шекли)
PM MAIL WWW ICQ Skype MSN   Вверх
MuForum
Дата 7.3.2008, 12:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 427
Регистрация: 13.6.2007
Где: Молдова, Кишинев

Репутация: нет
Всего: 4



Код

LRESULT CALLBACK WindowProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
    switch(uMsg)
    {
        case WM_CLOSE:
        case WM_DESTROY:
        case WM_NCDESTROY:
        case WM_QUIT:
        {
            return 0;
        }
        break;
        case WM_ACTIVATE:
        {
            if(LOWORD(wParam) == WA_INACTIVE) return DefWindowProc(hWnd, uMsg, wParam, lParam);
        }
        break;
        default: break;
    }
    return CallWindowProc((WNDPROC)NewWindowProc, hWnd, uMsg, wParam, lParam);
}



- Результат отрицательный, в любом случае если закрывать любое другое окно при помощи комбинации клавиш 'ALT + F4', окно игры тоже закрывается =(


--------------------
"Чтобы правильно задать вопрос, нужно знать большую часть ответа!" (Р. Шекли)
PM MAIL WWW ICQ Skype MSN   Вверх
Andrey44
Дата 7.3.2008, 15:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1501
Регистрация: 4.12.2006
Где: На работе

Репутация: 8
Всего: 26



Попробуй перехватить WM_SYSCOMMAND и wParam SC_CLOSE   


--------------------
????? ??, ??????? ?????.  smile 
PM MAIL WWW ICQ   Вверх
MuForum
Дата 7.3.2008, 16:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 427
Регистрация: 13.6.2007
Где: Молдова, Кишинев

Репутация: нет
Всего: 4



Код

LRESULT CALLBACK WindowProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
    switch(uMsg)
    {
        case WM_CLOSE:
        case WM_DESTROY:
        case WM_NCDESTROY:
        case WM_QUIT:
        {
            return 0;
        }
        break;
        case WM_ACTIVATE:
        {
            if(LOWORD(wParam) == WA_INACTIVE) return DefWindowProc(hWnd, uMsg, wParam, lParam);
        }
        break;
        case WM_SYSCOMMAND:
        {
            if(wParam == SC_CLOSE) return 0;
        }
        break;
        default: break;
    }
    return CallWindowProc((WNDPROC)NewWindowProc, hWnd, uMsg, wParam, lParam);
}


- Результат отрицательный. Окно игры также закрывается =(



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

- Но следующие эксперементы дали следующий результат:
Цитата

При закрытие окна игры при помощи кнопки 'Закрыть/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

Это сообщение отредактировал(а) MuForum - 7.3.2008, 16:17


--------------------
"Чтобы правильно задать вопрос, нужно знать большую часть ответа!" (Р. Шекли)
PM MAIL WWW ICQ Skype MSN   Вверх
Andrey44
Дата 7.3.2008, 16:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1501
Регистрация: 4.12.2006
Где: На работе

Репутация: 8
Всего: 26



А просто WM_COMMAND не пробовал?


--------------------
????? ??, ??????? ?????.  smile 
PM MAIL WWW ICQ   Вверх
MuForum
Дата 7.3.2008, 17:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 427
Регистрация: 13.6.2007
Где: Молдова, Кишинев

Репутация: нет
Всего: 4



Цитата(Andrey44 @ 7.3.2008,  16:24)
А просто WM_COMMAND не пробовал?

А чё смысл даже пробовать то а?
- Если нужно отлавливать только сообщения об закрытие, а не все подрят...


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

Это сообщение отредактировал(а) MuForum - 7.3.2008, 17:31


--------------------
"Чтобы правильно задать вопрос, нужно знать большую часть ответа!" (Р. Шекли)
PM MAIL WWW ICQ Skype MSN   Вверх
586
Дата 7.3.2008, 17:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2243
Регистрация: 8.5.2006

Репутация: 39
Всего: 146



У игры есть ещё окна? Может дело в них?

Добавлено через 37 секунд
Скрытые какие-нибудь... Посмотри в программе.
PM   Вверх
MuForum
Дата 7.3.2008, 17:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 427
Регистрация: 13.6.2007
Где: Молдова, Кишинев

Репутация: нет
Всего: 4



Цитата(586 @ 7.3.2008,  17:36)
У игры есть ещё окна? Может дело в них?

Добавлено @ 17:36
Скрытые какие-нибудь... Посмотри в программе.

Нет, у игры только одно окно.

P.S. -> Игра построена на графическом движке 'OpenGL'.


--------------------
"Чтобы правильно задать вопрос, нужно знать большую часть ответа!" (Р. Шекли)
PM MAIL WWW ICQ Skype MSN   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Системное программирование и WinAPI"
Fixin
GremlinProg
xvr
feodorv
  • Большое количество информации и примеров с использованием функций WinAPI можно найти в MSDN
  • Описание сообщений, уведомлений и примеров с использованием компонент WinAPI (BUTTON, EDIT, STATIC, и т.п.), можно найти в MSDN Control Library
  • Непосредственно, перед созданием новой темы, проверьте заголовок и удостоверьтесь, что он отражает суть обсуждения.
  • После заполнения поля "Название темы", обратите внимание на наличие и содержание панели "А здесь смотрели?", возможно Ваш вопрос уже был решен.
  • Приводите часть кода, в которой предположительно находится проблема или ошибка.
  • Если указываете код, пользуйтесь тегами [code][/code], или их кнопочными аналогами.
  • Если вопрос решен, воспользуйтесь соответствующей ссылкой, расположенной напротив названия темы.
  • Один топик - один вопрос!
  • Перед тем как создать тему - прочтите это .

На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы .


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема »


 




[ Время генерации скрипта: 0.0587 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.