-
Поставил хук на клавиатуру. Отлавливаю нажатие клавиши Win. Задача если была нажата Win + колесо мышки, то не выводить меню пуск, иначе нормальная реакция на клавишу Win.
-
Если стоит хук - то не пускай сообщение дальше по цепочке...
-
function LowLevelKeyboardProc(nCode: integer; wParam: longint; lParam: longint): integer; stdcall;
var p: PKBDLLHOOKSTRUCT;
Kill:Bool;
begin
Kill:=False;
if (nCode = HC_ACTION) then
begin
if (wParam=WM_KEYDOWN)or(wParam=WM_SYSKEYDOWN)then
begin
p:=PKBDLLHOOKSTRUCT(lParam);
if ((p^.vkCode=VK_LWIN)or(p^.vkCode=VK_RWIN)) then
begin
IsWinKeyPressed:=True;
end;
end
else
if (wParam=WM_KEYUP)or(wParam=WM_SYSKEYUP) then
begin
p:=PKBDLLHOOKSTRUCT(lParam);
if ((p^.vkCode=VK_LWIN)or(p^.vkCode=VK_RWIN)) then
IsWinKeyPressed:=False;
if ((p^.vkCode=VK_LWIN)or(p^.vkCode=VK_RWIN))and(IsMouseWheel) then
begin
IsMouseWheel:=False;
IsWinKeyPressed:=False;
end
end
end;
if Kill then
Result:=1
else
Result:=CallNextHookEx(0, nCode, wParam, lParam);
end;
И получается если я убиваю Win на KEYDOWN у меня она остается нажатой, если убиваю и на KEYUP, то кнопка вообще не работает, и горячие клавиши естественно тоже
-
> [0] irzyxa (05.09.10 21:25)
перехватить клавишу win таким способом, начиная с висты, не удастся.
-
Да я думал будет больше ответов. Решение нашел сам. Нужно просто нажать Win+ любую кнопку модификатор (Alt,Ctrl,Shift). function LowLevelKeyboardProc(nCode: integer; wParam: longint; lParam: longint): integer; stdcall;
var p: PKBDLLHOOKSTRUCT;
Kill:Bool;
begin
Kill:=False;
if (nCode = HC_ACTION) then
begin
if (wParam=WM_KEYDOWN)or(wParam=WM_SYSKEYDOWN)then
begin
p:=PKBDLLHOOKSTRUCT(lParam);
if ((p^.vkCode=VK_LWIN)or(p^.vkCode=VK_RWIN)) then
begin
IsWinKeyPressed:=True;
end;
end
else
if (wParam=WM_KEYUP)or(wParam=WM_SYSKEYUP) then
begin
p:=PKBDLLHOOKSTRUCT(lParam);
if ((p^.vkCode=VK_LWIN)or(p^.vkCode=VK_RWIN)) then
IsWinKeyPressed:=False;
if ((p^.vkCode=VK_LWIN)or(p^.vkCode=VK_RWIN))and(IsMouseWheel) then
begin
IsMouseWheel:=False;
IsWinKeyPressed:=False;
keybd_event(VK_LWIN,0,0,0);
keybd_event(VK_SHIFT,0,0,0);
keybd_event(VK_SHIFT,0,KEYEVENTF_KEYUP,0);
keybd_event(VK_LWIN,0,KEYEVENTF_KEYUP,0);
end
end
end;
if Kill then
Result:=1
else
Result:=CallNextHookEx(0, nCode, wParam, lParam);
end;
-
> [4] irzyxa © (09.09.10 14:59)
> if ((p^.vkCode=VK_LWIN)or(p^.vkCode=VK_RWIN)) then > begin > IsWinKeyPressed:=True; > // Kill:=True; > end;
ты, говорю, на семерке тестировал?
-
Без мыши но работает нормально, в том числе и в W7
program DisableLowLevelKeys;
uses
Windows, Messages;
const
LLKHF_ALTDOWN = KF_ALTDOWN shr 8;
WH_KEYBOARD_LL = 13;
type
TKBDLLHOOKSTRUCT = record
vkCode: DWORD;
scanCode: DWORD;
flags: DWORD;
time: DWORD;
dwExtraInfo: DWORD;
end;
PKBDLLHOOKSTRUCT = ^TKBDLLHOOKSTRUCT;
var
hhkLowLevelKybd: HHOOK;
function LowLevelKeyboardProc(nCode: integer; wParam: WPARAM; lParam: LPARAM): LRESULT; stdcall;
var
fEatKeystroke: boolean;
p: PKBDLLHOOKSTRUCT;
begin
fEatKeystroke := false;
if nCode = HC_ACTION then
begin
case wParam of
WM_KEYDOWN,
WM_SYSKEYDOWN,
WM_KEYUP,
WM_SYSKEYUP:
begin
p := PKBDLLHOOKSTRUCT(lParam);
fEatKeystroke := ((p^.vkCode = VK_LWIN) or (p^.vkCode = VK_RWIN)) or
((p^.vkCode = VK_TAB) and ((p^.flags and LLKHF_ALTDOWN) <> 0)) or
((p^.vkCode = VK_ESCAPE) and ((p^.flags and LLKHF_ALTDOWN) <> 0)) or
((p^.vkCode = VK_ESCAPE) and ((GetKeyState(VK_CONTROL) and $8000) <> 0)) or
((p^.vkCode = VK_F4) and ((p^.flags and LLKHF_ALTDOWN) <> 0));
end;
end;
end;
if fEatKeystroke then
result := 1
else
result := CallNextHookEx(0, nCode, wParam, lParam);
end;
begin
hhkLowLevelKybd := SetWindowsHookEx(WH_KEYBOARD_LL, LowLevelKeyboardProc, hInstance, 0);
MessageBox(0,
PChar('Alt+Esc, Ctrl+Esc, WIN, Alt+F4, and Alt+Tab are now disabled.' + #13#10 +
'Click "Ok" to terminate this application and re-enable these keys.'),
PChar('Disable Low-Level Keys'),
MB_OK);
UnhookWindowsHookEx(hhkLowLevelKybd);
end.
-
хм.. чудеса. сейчас протестил в своем проекте, там практически аналогичный код, за исключением того, что нажатия не просто блокируются, не просто ради блокировки. работает! хотя точно помню, что были проблемы с блокированием win не только в моем проекте, но и у конкурентов. может в каком-то обновлении винды починили..
-
На Win7 все работает нормально. Проверено
-
спасибо за рабочий код)
|