Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[18.116.21.229] |
|
Страницы: (2) [1] 2 все ( Перейти к последнему сообщению ) |
Сообщ.
#1
,
|
|
|
Подскажите, пожалуйста, как правиьно установить глобальный хук на выключение/перезагрузку винды? Как правильно вызывать SetWindowsHookEx? Я пробуюделать так :
SetWindowsHookEx(WH_HARDWARE,@HookProc,HInstance,0). Но мне кажется, что первый параметр надо брать другим, каким? ***** А дальше в dll-ке: function HookProc(Code:Integer; WParam:LongInt; LParam:LongInt):LongInt; stdcall; var Msg:TMessage; begin if Code=HC_ACTION then case TMsg(Pointer(LParam)^).Message of WM_QUIT: Beep(1000,300); else Result:=CallNextHookEx(SysHook,Code,WParam,LParam); end; end; Что в этой функции неправильно? |
Сообщ.
#2
,
|
|
|
почитай Фак там всё расписано
|
Сообщ.
#3
,
|
|
|
Red Wind, а зачем хук?
Отловить перезагрузку? |
Сообщ.
#4
,
|
|
|
2 Andrey_Kun :
В FAQ есть, но не совсем то. Я не знаю какое сообщение отлавливать. Пробовал WM_QUERYENDSESSION, WM_QUIT, WM_POWER, но из этого ниченго не работает. Но может я просто указываю неправильные значения в SetWindowsHookEx? Какую константу надо задавать первым параметром в моём случае? **** 2 Song : Мне надо чтобы моя прога первой (из всех других программ) узнавала об том, что windows собирается выключаться, и в случае чего запрещала выключение. |
Сообщ.
#5
,
|
|
|
Red Wind, не обязательно первой. Лови WM_QUERYENDSESSION и верни результат "неправильный" (не помню я какое число, читай хэлп).
|
Сообщ.
#6
,
|
|
|
Мне надо, чтобы именно первой. Пока очередь дойдёт до мой проги, все программы получившие WM_QUERYENDSESSION закроются, а мне нельзя этого допускать.
|
Сообщ.
#7
,
|
|
|
Ну ок, тогда хук на WH_GETMESSAGE и лови WM_QUERYENDSESSION
|
Сообщ.
#8
,
|
|
|
Это не работает!!! Вот код:
procedure SetHook; export; stdcall; Begin SysHook:=SetWindowsHookEx(WH_GETMESSAGE,@HookProc,HInstance,0); End; function HookProc(Code:Integer; WParam:LongInt; LParam:LongInt):LongInt; stdcall; begin if Code=HC_ACTION then case TMsg(Pointer(LParam)^).Message of WM_QUERYENDSESSION : begin Beep(3000,300); TMsg(Pointer(LParam)^).Message:=WM_NULL; end else Result:=CallNextHookEx(SysHook,Code,WParam,LParam); end; end; Где здесь ошибка? |
Сообщ.
#9
,
|
|
|
1) это dll ?
2) Ты должен вернуть Result:=0, но в tagMsg Result нет |
Сообщ.
#10
,
|
|
|
1) В dll.
2) А TMsg(Pointer(LParam)^).Message:=WM_NULL не подходит? |
Сообщ.
#11
,
|
|
|
Цитата Red Wind, 23.05.04, 21:08 2) А TMsg(Pointer(LParam)^).Message:=WM_NULL не подходит? Нет, так ты просто аннулируешь сообщение, а тебе надо сообщение оставить но вернуть отрицательный результат. |
Сообщ.
#12
,
|
|
|
И что мне сделать?
|
Сообщ.
#13
,
|
|
|
И вообще приведённым мной кодом ловятся не все сообщения. Например реакции на WM_QUERYENDSESSION никакой. Почему?
|
Сообщ.
#14
,
|
|
|
Ловятся все.
Что значит Цитата Red Wind, 30.05.04, 14:27 реакции на WM_QUERYENDSESSION никакой ? И как связано реакция с тем что сообщение ловится или не ловится? |
Сообщ.
#15
,
|
|
|
... WM_QUERYENDSESSION : begin Beep(3000,300);{!!!} TMsg(Pointer(LParam)^).Message:=WM_NULL; end ... При перехвате сообщения должен пискнуть динамик. При других (почему-то не всех) сообщений beep происходит. |