Проблемы с перехватом нажатия клавиш

Тема в разделе "WASM.WIN32", создана пользователем seiko, 26 ноя 2007.

  1. seiko

    seiko New Member

    Публикаций:
    0
    Регистрация:
    9 ноя 2007
    Сообщения:
    98
    Вот код клавиатурного хука
    Но здесь перехватывается лишь нажатие одной клавиши, а как перехватить комбинацию вроде CTRL + ALT + P короче комбинацию системных (драйвер не предлагать, я не такой спец)
    Я имел дело с GetKeyState но это жутко тормозит работу компа
    Через код в комментах можно проследить мои попытки
    Код (Text):
    1. program EmtyProject;
    2.  
    3. uses
    4.   windows,messages,wincls; ///Это модуль для регистрации и создания окон;
    5.  
    6. Var HookHandle:HHOOK=0;
    7.   hApp: THandle;
    8.   wClass: TWndClass;
    9.   wMSG: TMSG;
    10. ///  SHIFT,MENU:boolean;
    11.  
    12. function Win32Check(RetVal: BOOL): BOOL;
    13. begin
    14.   if not RetVal then GetLastError;
    15.   Result := RetVal;
    16. end;
    17.  
    18. function GetCharFromVKey(vkey: Word): string;
    19. var
    20.   keystate: TKeyboardState;
    21.   retcode: Integer;
    22. begin
    23.   Win32Check(GetKeyboardState(keystate));
    24.   SetLength(Result, 2);
    25.   retcode := ToAscii(vkey,
    26.     MapVirtualKey(vkey, 0),
    27.     keystate, @Result[1],
    28.     0);
    29.   case retcode of
    30.     0: Result := '';
    31.     1: SetLength(Result, 1);
    32.     2: ;
    33.     else
    34.       Result := '';
    35.   end;
    36. end;
    37.  
    38. function HookProc(Code: integer; WParam: word; LParam: Longint): Longint; stdcall;
    39. var
    40.   msg: PEVENTMSG;
    41.   s: string;
    42. begin
    43.   s:='';
    44.   if Code >= 0 then
    45.   begin
    46.    result := 0;
    47.    msg := Pointer(LParam);
    48.    case msg.message of
    49.    WM_KEYDOWN:
    50.     //case msg.paramL of
    51.     //VK_SHIFT: SHIFT:=true;
    52.     //VK_MENU: MENU:=true;
    53.     //else
    54.      begin
    55.       //If MENU and SHIFT then
    56.       s:=GetCharFromVKey(msg.paramL);
    57.       if (s<>'') and (s[1]='*') then
    58.       //MessageBox(0,'it works!!!','Program succeded',MB_ICONWARNING);
    59.       //SetForegroundWindow(GetDesktopWindow);
    60.       Windows.Beep(4400,500);
    61.      end;
    62.     //end;
    63.    {WM_KEYUP:
    64.     case msg.paramL of
    65.      VK_SHIFT: SHIFT:=false;
    66.      VK_MENU: MENU:=false;
    67.     end;}
    68.    else
    69.    result := CallNextHookEx(HookHandle, code, WParam, LParam);
    70.    end;
    71.   end;
    72. end;
    73.  
    74. procedure SetMyHook;
    75. begin
    76.   HookHandle := SetWindowsHookEx(WH_JOURNALRECORD, @HookProc, hInstance, 0);
    77. end;
    78.  
    79. procedure UnhookMyHook;
    80. begin
    81.   if HookHandle <> 0 then
    82.     UnhookWindowsHookEx(HookHandle);
    83. end;
    84.  
    85. function WndMessageProc(hWnd: HWND; Msg: UINT; wParam: WPARAM; lParam: LPARAM): UINT; stdcall;
    86. begin
    87.  Result := 0;
    88.   case Msg of
    89.    WM_CREATE: SetMyHook;
    90.    WM_DESTROY:
    91.    begin
    92.     UnhookMyHook;
    93.     halt;
    94.    end;
    95.  end;
    96.  Result := DefWindowProc(hWnd,Msg,wParam,lParam);
    97. end;
    98.  
    99. begin
    100.   wClass:=WndClass1(hInstance,0,0,0,0,0,COLOR_BTNFACE,'MYCLASS','',@WndMessageProc);
    101.   RegisterClass(wClass);
    102.   hApp:=CreateWindow(wClass.lpszClassName, '',0,
    103.   CW_USEDEFAULT, CW_USEDEFAULT,
    104.   0, 0, 0, 0, hInstance, nil);
    105.   if hApp=0 then
    106.   begin
    107.    UnregisterClass('MYCLASS',hInstance);
    108.    halt;
    109.   end;
    110.   loopWindow(wMsg);
    111. end.
    Придётся ли для перехвата комбинации клавиш изменять тип клавиатурной ловушки и переносить её в длл?
     
  2. seiko

    seiko New Member

    Публикаций:
    0
    Регистрация:
    9 ноя 2007
    Сообщения:
    98
    Чё так трудно ответить или вопрос чем-то некорректен?
     
  3. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    seiko
    как перехватить комбинацию ... системных ... драйвер не предлагать
    WH_KEYBOARD_LL?
     
  4. seiko

    seiko New Member

    Публикаций:
    0
    Регистрация:
    9 ноя 2007
    Сообщения:
    98
    а как в в ней сделать перехват комбинации системных клавиш и буквы, например
    CTRL + ALT +'H' или WIN + 'H'
    А то меня с этим проблемы, как проверить с помощью GetAsyncKetState, а то я не пойму че она возвращает, поскольку не знаю смысл оператора >> в сишнике, когда он используется не в потоке
    Вот че значит эта строчка:

    Код (Text):
    1. bool CTRLDOWN = GetAsyncKeyState(VK_CONTROL)>>((sizeof(short)*8)-1);
    И как также проверить остальные клавиши?
     
  5. RamMerLabs

    RamMerLabs Well-Known Member

    Публикаций:
    0
    Регистрация:
    11 сен 2006
    Сообщения:
    1.426
    >> - это сдвиг вправо на число бит, стоящее после этого оператора.

    вместо GetAsyncKeyState юзай хуки клавы.
     
  6. hecz

    hecz New Member

    Публикаций:
    0
    Регистрация:
    2 дек 2007
    Сообщения:
    3
    Код (Text):
    1. Клавиша  Код (hex)    Клавиша  Код (hex)    Клавиша  Код (hex)    Клавиша  Код (hex)    Клавиша  Код (hex)
    2. F1  3Bh Alt-B   30h Alt-O   18h Alt-1   78h left    4Bh
    3. F2  3Ch Alt-C   2Eh Alt-P   19h Alt-2   79h right   4Dh
    4. F3  3Dh Alt-D   20h Alt-Q   10h Alt-3   7Ah up  48h
    5. F4  3Eh Alt-E   12h Alt-R   13h Alt-4   7Bh down    50h
    6. F5  3Fh Alt-F   21h Alt-S   1fh Alt-5   7Ch Home    47h
    7. F6  40h Alt-G   22h Alt-T   14h Alt-6   7Dh End 4Fh
    8. F7  41h Alt-H   23h Alt-U   16h Alt-7   7Eh PgUp    49h
    9. F8  42h Alt-I   17h Alt-V   2Fh Alt-8   7Fh PgDn    51h
    10. F9  43h Alt-J   24h Alt-W   11h Alt-9   80h PgDn    51h
    11. F10 44h Alt-K   25h Alt-X   2Dh Alt--   82h Shift-F10   5Dh
    12. F11 85h Alt-L   26h Alt-Y   15h Alt-=   83h Ctrl-F10    67h
    13. F12 86h Alt-M   32h Alt-Z   2Ch Ins 52h Alt-F10 71h
    14. Alt-A   1Eh Alt-N   31h Alt-0   81h Del 53h
     
  7. seiko

    seiko New Member

    Публикаций:
    0
    Регистрация:
    9 ноя 2007
    Сообщения:
    98
    Спасибо за табличку, слушай а можешь дать ссылки про программирование на вин32 близкое к ядру, но выполняющееся в третьем кольце, а то я пока драйвера писать не собираюсь, и не хочется отключать каспер, но неплохо было сначала изучить вообще что можно сделать в юзермоде а то его аварийные перезагрузки компьтера от простой InitializeRing0Library меня убивают и не помешала бы какая-нить реальная статья про все виды клавиатурных ловушек, типа обзорной, типа сравнение какая когда лучше и методы реализации (можно на MASM, хотя лучше на C или Delphi) А то инфа по кускам плохо в башке сходится во что-то более менее цельное