Хук-отслеживание закрытия программы

Тема в разделе "Общие вопросы по С и С++", создана пользователем solova, 10 апр 2011.

Статус темы:
Закрыта.
  1. solova

    solova Гость

    Есть программа:
    на ней туллбар с кнопкой[выход]
    закрытие на "крестик" или Alt+F4 приводит к сворачиванию в трей
    в окне есть меню, и один из пунктов [выход]
    Так вот проблема такая.
    Через хук пытаюсь узнать о закрытии этой программы.
    Нажатие на кнопку [выход] - "ОК"
    Закрытие на "крестик" или Alt+F4 - не имеет смысла т.к. не закрывает, а сворачивает
    Выход через меню иконки в трее - "ОК"
    Выход через системное меню(МouseRButt на макушке окна,вуаля->менюшка)- ОЧЕНЬ НЕ "ОК"<div class="sp-wrap"><div class="sp-head-wrap"><div class="sp-head folded clickable">Код обработки сообщений хуком</div></div><div class="sp-body"><div class="sp-content">
    Код (C++):
    LRESULT CALLBACK CallWndProc(int nCode, WPARAM wParam, LPARAM lParam)
    {
    CWPSTRUCT *cwp=(CWPSTRUCT*)lParam;
    switch(cwp->message)
    {
    case WM_CLOSE:
    //Пункт[выход]--меню окна и трея,+[выход] Button(в toolbar-e)
    {
    UnhookWindowsHookEx(hHook);
    MessageBox(0,L"Был выход через меню или кнопку",L"От Хука",0);
    break;
    }
    case WM_COMMAND:
    //Отдельно [выход]Button(в toolbar-e)
    {
    if(LOWORD(cwp->wParam)==57665)
    {
    UnhookWindowsHookEx(hHook);
    MessageBox(0,L"Была нажата кнопка Выход",L"От Хука",0);
    }
    break;
    }
    case WM_SYSCOMMAND:
    //Alt+F4 или "Крестик"--сворачивают окно в трей(или закрывают дочернее окно)
    {
    if(LOWORD(cwp->wParam==SC_CLOSE))
    MessageBox(0,L"Свёрнуто в трей или закрыто дочернее окно",L"От Хука",0);
    break;
    }
    }
    return CallNextHookEx(hHook,nCode,wParam,lParam);
    }
    Можно ли отследить закрытие через системное меню?
    Добавлено:При закрытии через системное меню пишет такой лог<div class="sp-wrap"><div class="sp-head-wrap"><div class="sp-head folded clickable">Spy++ LOG</div></div><div class="sp-body"><div class="sp-content">S WM_MENUSELECT uItem:57665 fuFlags... hmenu:...[wParam:A080E141 lParam:...]
    P WM_LBUTTONDOWN...
    S WM_MENUSELECT(меню закрывается)
    P WM_SYSCOMAND uCmdType:E140 xPos... yPos...[wParam:0000E141 lParam:...]
    P WM_CLOSE но хук этот WM_CLOSE не ловит почему то

    Добавлено: у меня хук (WH_CALLWNDPROC) он вообще ловит что то системное кроме [Min] [Max] [Exit]
    Я его ставлю на поток, а системное меню относится к нему?
     
  2. a0z

    a0z Well-Known Member

    Регистрация:
    15 мар 2011
    Сообщения:
    109
    Симпатии:
    0
    Может лучше WH_CBT?
     
  3. solova

    solova Гость

    Да, я уже думал о WH_CBT, для WM_SYSCOMMAND самое то, но мне легче с моим хуком(мне для работы с окном и его внутренностями).
    поэтому и спрашиваю "...он вообще ловит что то системное кроме..."
    Мой хук тоже улавливает WM_SYSCOMMAND -- (кнопки в сисменю)SC_MINIMIZE, SC_MAXIMIZE, SC_CLOSE но остальное он не видит почему то.
    В выпадающем системном меню он эти 3 тоже улавливает но пункты (Переместить, Размер, Восстановить), нет.
    Заметил интересный факт:
    В этой программе на SC_CLOSE идёт сворачивание в трей,
    в выпадающем системном меню, пункт с ID (LOWORD wParam) 0xF060 он же SC_CLOSE, переименован в "свернуть в трей"
    и под этим пунктом добавлен ещё один с названием "Закрыть" на него установлен уже другой ID 0xE141 и если перевести в 10* этот ID равен 57665 прям точ в точ как ID Кнопки[выход] на toolbar-е.
    Получается пункт системного меню с ID 0xE141 каким то образом одно и тоже что та кнопка.
    <div class="sp-wrap"><div class="sp-head-wrap"><div class="sp-head folded clickable">Spy++ Log</div></div><div class="sp-body"><div class="sp-content">навожу на пункт меню
    S WM_MENUSELECT uItem:57665 fuFlags... hmenu:...[wParam:A080E141 lParam:...]
    Тыркаю его
    P WM_SYSCOMAND uCmdType:E140 xPos... yPos...[wParam:0000E141 lParam:...]

    А вот нажатие на кнопку
    S WM_COMMAND wNotifyCode:0000 wID:57665 hwndCtl:...[wParam:0000E141 lParam:...]WM_COMMAND с LOWORD wParam=57665 -ловится
    WM_SYSCOMAND с с LOWORD wParam=57665 -не ловится
    может не ловятся Постмессаджи (WM_SYSCOMAND постмессаджом шлётся) ну тагдаб и свернуть развернуть не ловил бы хук.
    Может пункт системного меню запускает обработчик кнопки[выход] но как это отследить можно? без WM_SYSCOMAND(ну или разобраться как отловить эту заразу WM_SYSCOMAND )
    блин WH_CALLWNDPROC не реагирует на РostМessage-ы, так что придётся два хука ставить.
     
Загрузка...
Статус темы:
Закрыта.

Поделиться этой страницей