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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [VC++] Закрытие программы: ALT + F4, Активное окно. Фильтрация деактивации. 
:(
    Опции темы
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   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "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.0553 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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