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

  • Автор темы solova
  • Дата начала
Статус
Закрыто для дальнейших ответов.
S

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]
Я его ставлю на поток, а системное меню относится к нему?
 
S

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-ы, так что придётся два хука ставить.
 
Статус
Закрыто для дальнейших ответов.
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!