Skocz do zawartości

[DELPHI]TKeySpyXP


dpher

Polecane posty

Zastanawiam się, czy jest możliwość wykorzystania tego komponentu, żeby wywoływał procedury wraz z naciśnięciem kombinacji ctrl+v?

Chcę napisać program, który podmienia wartości w schowku po kliknięciu ctrl+v (tylko dla wygody).

 

Jeśli jest taka możliwość to prosiłbym o wskazanie w jaki sposób to zrobić.

Link do komentarza
Udostępnij na innych stronach

A po co używać tego komponentu z timerami, jak powinien na wszystkich nowszych Windowsach od XP począwszy

zadziałać taki globalny Hook na klawiaturę jak pokazałem poniżej. Tylko trochę szkoda że nie szukałeś samodzielnie

informacji na ten temat, bo tak napisałem cały program za Ciebie i nic się nie nauczyłeś. Kod testowałem pod Delphi 7

Personal oraz Windows XP SP 2 i działa jak należy. Dodam, że podobne kody znaleźć można w google i dopasować.

//...
var
 Form1 : TForm1;

const
 WH_KEYBOARD_LL = $000D;

type
 tagKBDLLHOOKSTRUCT = packed record
   vkCode : DWord;
   ScanCode : DWord;
   Flags : DWord;
   Time : DWord;
   dwExtraInfo : integer;
 end;
 KBDLLHOOKSTRUCT = tagKBDLLHOOKSTRUCT;
 PKBDLLHOOKSTRUCT = ^KBDLLHOOKSTRUCT;

var
 HKHook : HHook;

implementation

{$R *.dfm}

procedure CopyTextToClipBoard(TextToCopy : string);
var
 ClipBoardH : HGLOBAL;
begin
 OpenClipboard(0);
 EmptyClipboard;
 ClipBoardH := GlobalAlloc(GMEM_MOVEABLE and GMEM_DDESHARE, Length(TextToCopy) + 1);
 StrCopy(GlobalLock(ClipBoardH), PChar(TextToCopy));
 GlobalUnlock(ClipBoardH);
 SetClipboardData(CF_TEXT, ClipBoardH);
 CloseClipboard;
end;

function LowLevelKeyboardProc(nCode : Integer; wParam : Integer; lParam : Integer) : Integer; stdcall; export;
{$WARN COMPARING_SIGNED_UNSIGNED OFF}
var
 Hook : PKBDLLHOOKSTRUCT;
 bControlKeyDown : boolean;
begin
 Hook := Pointer(lParam);
 case nCode of
   HC_ACTION :
     begin
       bControlKeyDown := ((GetAsyncKeyState(VK_CONTROL) shr ((Sizeof(SHORT) * 8) - 1)) <> 0);
       if (Hook.vkCode = VKKeyScan('v')) and (bControlKeyDown = True) then
       begin
         CopyTextToClipBoard('Tekst do wklejenia do Schowka');
         Result := 0; // Lub Result := 1; jak System ma nie reagować na klawisz tylko skopiować tekst
       end
       else
       begin
         Result := CallNextHookEx(HKHook, nCode, wParam, lParam);
       end;
     end;
 else
   begin
     Result := CallNextHookEx(HKHook, nCode, wParam, lParam);
   end;
 end;
end;

procedure TForm1.FormCreate(Sender : TObject);
begin
 HKHook := SetWindowsHookEx(WH_KEYBOARD_LL, @LowLevelKeyboardProc, hInstance, 0);
end;

procedure TForm1.FormDestroy(Sender : TObject);
begin
 UnHookWindowsHookEx(HKHook);
end;

Pozdrawiam: olesio

Link do komentarza
Udostępnij na innych stronach

Zarchiwizowany

Ten temat jest archiwizowany i nie można dodawać nowych odpowiedzi.

×
×
  • Utwórz nowe...