Jak zrobić globalnego hooka reagującego na wcisnięcie klawisza "s/w"?

0

Witam,

Jak zrobić globalnego hooka reagującego na wcisnięcie klawisza "s/w"?
Mam coś takiego:

function LowLevelKeybdHookProc(nCode, wParam, lParam : integer) : integer; stdcall;
// possible wParam values: WM_KEYDOWN, WM_KEYUP, WM_SYSKEYDOWN, WM_SYSKEYUP
var
  info : ^KeybdLLHookStruct absolute lParam;
  lpChar : word;
  kState : TKeyboardState;
  h:HWND;
begin
result := CallNextHookEx(kHook, nCode, wParam, lParam);
h := FindWindow(nil, 'programik');
with info^ do

case wParam of
  wm_keydown : begin

    GetKeyboardState(kState);
 if (vkCode = VK_Pause) then
  begin
  SendMessage(h, WM_KEYdown,VK_RCONTROL, 0);
  SendMessage(h, WM_KEYdown,VK_DOWN, 0);


  Form2.label1.caption := 's'
  end
  else
  if (vkCode = 57) then
  begin
  SendMessage(h, WM_KEYdown,VK_LCONTROL, 0);
  SendMessage(h, WM_KEYdown,VK_UP, 0);
  SendMessage(h, WM_KEYup,VK_LCONTROL, 0);
  SendMessage(h, WM_KEYup,VK_UP, 0);
  Form2.label1.caption := 'w'
  end;
  end;
end;
end;

Z "pause" niby działa, lecz nie działa po wcisnięciu "w".

0

czy na pewno ma być 57 a nie 87 ?

if (vkCode = 87) then

i zwróć uwagę na formatowanie kodu

0

Dzięki. Wystarczyło dodać "$" :D Jak zrobić, by były zawsze wciskane dwa klawisze z klawiatury?

0

Dzięki. Wystarczyło dodać "$" :D

Zamiast strzelać z kodem znaku w, mogłeś i nadal możesz skorzystać z VK_W :]

Jak zrobić, by były zawsze wciskane dwa klawisze z klawiatury?

Opisz dokładniej, bo to pytanie jest zbyt ogólne.

0

Konkretnie chodzi mi o to, by wciskany był klawisz ctrl + s na raz.

2

Hej :)

Dawno się nie udzialałem. A to (sub)forum - także moderatorsko - doglądają pozostali. Bo ja mam sprawy serocowo - rodzinno - zaowodowe i to mnie pochłania. A tutaj zaglądam raz na jakiś czas :) A wedlug mnie najprościej i w sprawdzony sposób to, o co pytasz - można osiągnąć poniższym kodem.


//...

uses
  Windows;

//...

procedure KeyDownUp(KeyToSend : Byte; KeyDown : boolean);
const
  DownUp_Flags_Arr : array[boolean] of DWORD = (0, KEYEVENTF_KEYUP);
  Extended_Flags_Arr : array[boolean] of DWORD = (0, KEYEVENTF_EXTENDEDKEY);
var
  Input : TagINPUT;
  KeyExtended : boolean;
begin
  Input.Itype := INPUT_KEYBOARD;
  Input.ki.wVK := KeyToSend;
  Input.ki.wScan := MapVirtualKey(KeyToSend, 0);
  KeyExtended := KeyToSend in [VK_CONTROL, VK_LCONTROL, VK_RCONTROL,
    VK_UP, VK_DOWN, VK_LEFT, VK_RIGHT, VK_HOME, VK_END, VK_PRIOR,
    VK_NEXT, VK_INSERT, VK_DELETE, VK_MENU];
  Input.ki.dwFlags := DownUp_Flags_Arr[not KeyDown] or Extended_Flags_Arr[KeyExtended];
  Input.ki.time := 0;
  SendInput(1, Input, SizeOf(Input));
end;

//...
  KeyDownUp(vk_CONTROL, True);
  KeyDownUp(Ord('S'), True);
  KeyDownUp(Ord('S'), False);
  KeyDownUp(vk_CONTROL, False);
//...

1 użytkowników online, w tym zalogowanych: 0, gości: 1