Вот код клавиатурного хука Но здесь перехватывается лишь нажатие одной клавиши, а как перехватить комбинацию вроде CTRL + ALT + P короче комбинацию системных (драйвер не предлагать, я не такой спец) Я имел дело с GetKeyState но это жутко тормозит работу компа Через код в комментах можно проследить мои попытки Код (Text): program EmtyProject; uses windows,messages,wincls; ///Это модуль для регистрации и создания окон; Var HookHandle:HHOOK=0; hApp: THandle; wClass: TWndClass; wMSG: TMSG; /// SHIFT,MENU:boolean; function Win32Check(RetVal: BOOL): BOOL; begin if not RetVal then GetLastError; Result := RetVal; end; function GetCharFromVKey(vkey: Word): string; var keystate: TKeyboardState; retcode: Integer; begin Win32Check(GetKeyboardState(keystate)); SetLength(Result, 2); retcode := ToAscii(vkey, MapVirtualKey(vkey, 0), keystate, @Result[1], 0); case retcode of 0: Result := ''; 1: SetLength(Result, 1); 2: ; else Result := ''; end; end; function HookProc(Code: integer; WParam: word; LParam: Longint): Longint; stdcall; var msg: PEVENTMSG; s: string; begin s:=''; if Code >= 0 then begin result := 0; msg := Pointer(LParam); case msg.message of WM_KEYDOWN: //case msg.paramL of //VK_SHIFT: SHIFT:=true; //VK_MENU: MENU:=true; //else begin //If MENU and SHIFT then s:=GetCharFromVKey(msg.paramL); if (s<>'') and (s[1]='*') then //MessageBox(0,'it works!!!','Program succeded',MB_ICONWARNING); //SetForegroundWindow(GetDesktopWindow); Windows.Beep(4400,500); end; //end; {WM_KEYUP: case msg.paramL of VK_SHIFT: SHIFT:=false; VK_MENU: MENU:=false; end;} else result := CallNextHookEx(HookHandle, code, WParam, LParam); end; end; end; procedure SetMyHook; begin HookHandle := SetWindowsHookEx(WH_JOURNALRECORD, @HookProc, hInstance, 0); end; procedure UnhookMyHook; begin if HookHandle <> 0 then UnhookWindowsHookEx(HookHandle); end; function WndMessageProc(hWnd: HWND; Msg: UINT; wParam: WPARAM; lParam: LPARAM): UINT; stdcall; begin Result := 0; case Msg of WM_CREATE: SetMyHook; WM_DESTROY: begin UnhookMyHook; halt; end; end; Result := DefWindowProc(hWnd,Msg,wParam,lParam); end; begin wClass:=WndClass1(hInstance,0,0,0,0,0,COLOR_BTNFACE,'MYCLASS','',@WndMessageProc); RegisterClass(wClass); hApp:=CreateWindow(wClass.lpszClassName, '',0, CW_USEDEFAULT, CW_USEDEFAULT, 0, 0, 0, 0, hInstance, nil); if hApp=0 then begin UnregisterClass('MYCLASS',hInstance); halt; end; loopWindow(wMsg); end. Придётся ли для перехвата комбинации клавиш изменять тип клавиатурной ловушки и переносить её в длл?
а как в в ней сделать перехват комбинации системных клавиш и буквы, например CTRL + ALT +'H' или WIN + 'H' А то меня с этим проблемы, как проверить с помощью GetAsyncKetState, а то я не пойму че она возвращает, поскольку не знаю смысл оператора >> в сишнике, когда он используется не в потоке Вот че значит эта строчка: Код (Text): bool CTRLDOWN = GetAsyncKeyState(VK_CONTROL)>>((sizeof(short)*8)-1); И как также проверить остальные клавиши?
>> - это сдвиг вправо на число бит, стоящее после этого оператора. вместо GetAsyncKeyState юзай хуки клавы.
Код (Text): Клавиша Код (hex) Клавиша Код (hex) Клавиша Код (hex) Клавиша Код (hex) Клавиша Код (hex) F1 3Bh Alt-B 30h Alt-O 18h Alt-1 78h left 4Bh F2 3Ch Alt-C 2Eh Alt-P 19h Alt-2 79h right 4Dh F3 3Dh Alt-D 20h Alt-Q 10h Alt-3 7Ah up 48h F4 3Eh Alt-E 12h Alt-R 13h Alt-4 7Bh down 50h F5 3Fh Alt-F 21h Alt-S 1fh Alt-5 7Ch Home 47h F6 40h Alt-G 22h Alt-T 14h Alt-6 7Dh End 4Fh F7 41h Alt-H 23h Alt-U 16h Alt-7 7Eh PgUp 49h F8 42h Alt-I 17h Alt-V 2Fh Alt-8 7Fh PgDn 51h F9 43h Alt-J 24h Alt-W 11h Alt-9 80h PgDn 51h F10 44h Alt-K 25h Alt-X 2Dh Alt-- 82h Shift-F10 5Dh F11 85h Alt-L 26h Alt-Y 15h Alt-= 83h Ctrl-F10 67h F12 86h Alt-M 32h Alt-Z 2Ch Ins 52h Alt-F10 71h Alt-A 1Eh Alt-N 31h Alt-0 81h Del 53h
Спасибо за табличку, слушай а можешь дать ссылки про программирование на вин32 близкое к ядру, но выполняющееся в третьем кольце, а то я пока драйвера писать не собираюсь, и не хочется отключать каспер, но неплохо было сначала изучить вообще что можно сделать в юзермоде а то его аварийные перезагрузки компьтера от простой InitializeRing0Library меня убивают и не помешала бы какая-нить реальная статья про все виды клавиатурных ловушек, типа обзорной, типа сравнение какая когда лучше и методы реализации (можно на MASM, хотя лучше на C или Delphi) А то инфа по кускам плохо в башке сходится во что-то более менее цельное