Модераторы: 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   Вверх
586
Дата 7.3.2008, 23:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(MuForum @  7.3.2008,  01:00 Найти цитируемый пост)
А при использование комбинации клавиш 'ALT + F4', отправляется системное сообщение всем активным окнам о закрытие(На сколько я знаю и на сколько я заметил).

А с чего это вдруг окно игры активно? Ты просто не передаёшь сообщение оригинальной функции окна, окно то всё равно деактивируется. Мне кажется, что происходит ошибка в игре, например, окно ниразу не деактивировалось, но несколько раз активировалось (программист, который писал игру это просто не предвидел). Попробуй запустить игру под отладчиком и посмотри.
PM   Вверх
MuForum
Дата 7.3.2008, 23:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(586 @ 7.3.2008,  23:26)
Цитата(MuForum @  7.3.2008,  01:00 Найти цитируемый пост)
А при использование комбинации клавиш 'ALT + F4', отправляется системное сообщение всем активным окнам о закрытие(На сколько я знаю и на сколько я заметил).

А с чего это вдруг окно игры активно? Ты просто не передаёшь сообщение оригинальной функции окна, окно то всё равно деактивируется. Мне кажется, что происходит ошибка в игре, например, окно ниразу не деактивировалось, но несколько раз активировалось (программист, который писал игру это просто не предвидел). Попробуй запустить игру под отладчиком и посмотри.

Не думаю...
Код

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


- Следующий код не помогает, окно всё равно закрывается. =(


P.S. -> У меня есть одна '.dll', в который как-то это реализовано, и окно не влияет на 'ALT + F4', но к сожалению я не силён в ASM(masm). =(
- Пробовал копаться через 'OllyDbg', но не зная хорошо языка, мало что поймёш/.. 

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


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


Эксперт
****


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

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



Цитата(MuForum @  7.3.2008,  23:43 Найти цитируемый пост)
У меня есть одна '.dll', в который как-то это реализовано, и окно не влияет на 'ALT + F4', но к сожалению я не силён в ASM(masm). 

выкладывай, посмотрю (если это исходник)

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


Опытный
**


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

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



Вот тут 'launcher.exe' и 'cesdn.dll' (Вирусов нету в архиве)

Присоединённый файл ( Кол-во скачиваний: 10 )
Присоединённый файл  MU_launcher_WM.rar 53,43 Kb


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


Эксперт
****


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

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



Код
LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
    switch(uMsg)
    {
    case WM_ACTIVATEAPP:
    case WM_ACTIVATE:
    case WM_SETFOCUS:
    case WM_KILLFOCUS:
        return 0;

    case WM_CLOSE:
        if(__hWnd && oldWndProc) {
            SetWindowLong(hWnd, GWL_WNDPROC, oldWndProc);
            SendMessageA(hWnd, WM_CLOSE, 0, 0);
            ShowWindow(hWnd, SW_SHOWNORMAL);
            __hWnd = 0;
            oldProc = 0;
            return 0; 
        }
        break;

    case WM_TIMER:
        //....

    case WM_USER + 0x3e9:
        // ....
    }
    return CallWindowProcA(oldProc, hWnd, uMsg, wParam, lParam);
}


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


Опытный
**


Профиль
Группа: Участник
Сообщений: 651
Регистрация: 8.3.2008
Где: Украина, Харьков

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



Предпологаю, что в игре основной цикл органицован примерно так:
Код

while(GetMessage(...))
{
   if (msg == WM_QUIT)
      quit();
   TranslateMessage(...);
   DispatchMessage(...);
}

т.е. до Dispatch'a дело не доходит.

Цитата

У меня есть одна '.dll', в который как-то это реализовано, и окно не влияет на 'ALT + F4', но к сожалению я не силён в ASM(masm). =(

Предпологаю (т.к. присутствует dll), что в данном случае используется HOOK, с помощью которого отлавливается сообщение и не передается дальше по цепочке.
PM   Вверх
MuForum
Дата 8.3.2008, 15:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



# 586 - Попробовал сделать так, как ты написал, результат отрицательный =(

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

# Установка глобального хука вида '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++ тоже не показывает, чтобы сообщение приходило о закрытие), но окно игры закрывается =(

Это сообщение отредактировал(а) MuForum - 15.3.2008, 23:50


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


Опытный
**


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

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



Парни, а что если при запуске моей программы, установить глобальный хук и перехватывать все нажатия 'ALT + F4' и обнулять(чтобы сообщение не прошло до следующего хука), а закрывать программы вот таким образом:
Код

PostMessage(GetForegroundWindow(), WM_CLOSE, 0, 0);



P.S. -> Хотелось бы услышать мнения со стороны косметики, нормально ли это будет?

Добавлено через 5 минут и 56 секунд
# for 586 - К сожалению не получилось сделать по твоему декомпилу кода с .dll =(
Код

LRESULT CALLBACK WindowProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
    switch(uMsg)
    {    
        case WM_ACTIVATE:
        case WM_ACTIVATEAPP:
        case WM_SETFOCUS:
        case WM_KILLFOCUS:
        {
            return 0;
        }
        break;
        case WM_CLOSE:
            if(MU_hWnd != 0 && OldWindowProc != 0)
            {
                SetWindowLong(MU_hWnd, GWL_WNDPROC, (long)OldWindowProc);
                SendMessage(MU_hWnd, WM_CLOSE, 0, 0);
                ShowWindow(MU_hWnd, SW_SHOWNORMAL);
                MU_hWnd = 0;
                OldWindowProc = 0;
                return 0; 
            }
        break;
        case WM_USER + 0x3e9:
            if(MU_hWnd != 0 && OldWindowProc != 0)
            {
                SetWindowLong(MU_hWnd, GWL_WNDPROC, (long)OldWindowProc);
                ShowWindow(MU_hWnd, SW_SHOWNORMAL);
                return 0;
            }
        break;
        case WM_TIMER:
            if(wParam == 1001)
            {
                KillTimer(hWnd, wParam);
                return 0;
            }
        break;
        default: break;
    }
    return CallWindowProc((WNDPROC)OldWindowProc, hWnd, uMsg, wParam, lParam);
}


- Окно также закрывается при использование комбинации клавиш 'ALT + F4' =(

Это сообщение отредактировал(а) MuForum - 9.3.2008, 18:23


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


Опытный
**


Профиль
Группа: Участник
Сообщений: 651
Регистрация: 8.3.2008
Где: Украина, Харьков

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



Цитата
Парни, а что если при запуске моей программы, установить глобальный хук и перехватывать все нажатия 'ALT + F4' и обнулять(чтобы сообщение не прошло до следующего хука), а закрывать программы вот таким образом:

в вашем случаю "правильным" будет то, что будет работать smile
и в данном случае "что будет работать" не может сказать никто, пробуйте...
т.к. это скорее хакинг, а не программинг (если так можна выразиться).
а что у вас за Windows? интересно
мне моя XP говорит "отказано в доступе" при попытки получить WNDPROC чужого процесса...
или вы как-то внедряетесь в чужой процесс?
PM   Вверх
Страницы: (2) [Все] 1 2 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "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.0739 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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