Reakcja na wciśnięcie klawisza

0

Hej!

Moim celem jest napisanie banalnego programu, który po kliknięciu SPACE będzie pobierał pozycję kursora. Myślałem, że to będzie proste, ale niestety, program nie reaguje, gdy okno jest nieaktywne. Nie chce wymuszać aktywności konta, gdyż ten program ma pozwalać na swobodę użytkownika.

Source

procedure TForm1.button1KeyPress(Sender: TObject; var Key: Char);
var
pos:Tpoint;
begin
 GetCursorPos(pos);
if key=#32 then edit1.Text:=inttostr(pos.x)    ;
end; 
0

W takim razie musisz założyć hooka na klawiaturę.
Masę gotowych kodów znajdziesz w Internecie.

0

Sorki, ale moje programowanie jest jeszcze na wysokim poziomie albo raczej nigdy wcześniej nie programowałem programów tego typu, więc nie za bardzo wiem co to hook ani jak go założyć. czy mógłby mi ktoś to jasno wytłumaczyć (nie chce gotowców, bo planuję kilka programów tego typu).

0

Trochę poczytałem i chciałem założyć takie coś:

 RegisterHotKey(Form1.Handle, VK_SPACE);

jednak to coś średnio działa :(

edit
Przed chwilą znalazłęm takie coś

 RegisterhotKey(Form1.Handle, $0001, 0, vk_space)

Tym razem jednak w ogóle nie działa nawet w aktywnym oknie

0

a wiesz co to keylogger i z czego się składa (KeySpyXP) taki komponent albo na kompendium masz global hook ile razy jeszcze to napiszecie, wiesz do czego jest dział newbie ?

0

keyspy nie działa na moim systemie, a innych kodów szukam od tygodnia

0
micosa97 napisał(a)

procedure TForm1.button1KeyPress(Sender: TObject; var Key: Char);

Nie wiesz dlaczego nie działa? Bo oprogramowałeś wciśnięcie klawisza przycisku Button1, a nie formularza; To będzie działać jedynie wtedy, gdy aktywny jest przycisk i wciśniesz klawisz o kodzie #32, czyli Spację (czyli tak jakbyć kliknął LPM na nim);

Zrób to w zradzeniu OnKeyDown formularza w ten sposób:

procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
var
  pntMouse: TPoint;
begin
  if Key = VK_SPACE then
    begin
      GetCursorPos(pntMouse);
      edtMousePos.Text := 'X: ' + IntToStr(pntMouse.X) + ', Y: ' + IntToStr(pntMouse.Y);
    end;
end;

Będzie działać, ale tylko wtedy, gdy formularza będzie aktywny; Jeżeli zależy Ci na tym, by odczytywać pozycje myszy bez względu na to, czy okno aplikacji jest aktywne czy nie, musisz założyć hook'a na klawiaturę;

W załączniku masz przykład aplikacji wykorzystującej powyższy kod, która działa w 100%;

0
Furious Programming napisał(a)
micosa97 napisał(a)

procedure TForm1.button1KeyPress(Sender: TObject; var Key: Char);

Nie wiesz dlaczego nie działa? Bo oprogramowałeś wciśnięcie klawisza przycisku Button1, a nie formularza; To będzie działać jedynie wtedy, gdy aktywny jest przycisk i wciśniesz klawisz o kodzie #32, czyli Spację (czyli tak jakbyć kliknął LPM na nim);

Zrób to w zradzeniu OnKeyDown formularza w ten sposób:

procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
var
  pntMouse: TPoint;
begin
  if Key = VK_SPACE then
    begin
      GetCursorPos(pntMouse);
      edtMousePos.Text := 'X: ' + IntToStr(pntMouse.X) + ', Y: ' + IntToStr(pntMouse.Y);
    end;
end;

Będzie działać, ale tylko wtedy, gdy formularza będzie aktywny; Jeżeli zależy Ci na tym, by odczytywać pozycje myszy bez względu na to, czy okno aplikacji jest aktywne czy nie, musisz założyć hook'a na klawiaturę;

W załączniku masz przykład aplikacji wykorzystującej powyższy kod, która działa w 100%;

Oczywiście, jest to dla formularza :). Wcześniej programowałem dla buttona i zapomniałem zmienić.

0

Zapomniałem dodać, że musisz ustawić właściwość KeyPreview na True, żeby formularz przechwytywał wszystkie klawisze;

Napisałeś coś, czy tylko czytasz posty..?

0

Ok, już wszystko działa. wielkie dzięki :)

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