Myszka, klopot ze wspolrzednymi

0

Witam, mama taki klopot potzrebuje pobrac poycje myszki z pewnego meisjca na pulpicie. ALe chce zeby to sie działo w nastepujacej koelsjnosci wciskam buttom najezdam na miejsce ktre chce wybrac i wciskam LPM, programik pobiera wpolrzedne punktu i wysyla je np do labela

Napisałem coś takiego:

procedure TOpcje.pobieranieClick(Sender: TObject);
var
  pozycja: TPoint;

begin
getcursorpos(pozycja); //pobieranie
//wysyłanie
EditPozX.Text := IntToStr(pozycja.X);
EditPozY.Text := IntToStr(pozycja.Y);
end;

jednak efekt jest taki ze uzyskuje wpolrzedne buttona ktory wciskam:(

Jak mam to pzrerobic aby uzuskac efekt jaki potzrebuje

0

Może zrób tak, żeby po wciśnięciu Buttona zmianiała się wartość jakiejś zmiennej globalnej typu boolean na True, a potem w onClick formy podstaw ten kod co podałeś z warunkiem, że sprawdzi się tylko gdy zmienna boolean jest True.

0

To działa ale tylko w obrębie formy:

type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private      { Private declarations }
  ShowXY : boolean;
  procedure PokazWSP(var MSG:Tmessage); message WM_LBUTTONDOWN;
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.Button1Click(Sender: TObject);
begin
if ShowXY then exit;
ShowXY:=true;
end;

procedure TForm1.PokazWSP(var MSG: Tmessage);
var x,y:word;
begin
if (ShowXY) and (MSG.WParam=MK_LBUTTON) then
   begin
   x:=MSG.LParamLo;
   y:=MSG.LParamHi;
   showmessage(CurrToStr(x)+', '+CurrToStr(y));
   ShowXY:=false;
   end;
end;

end.

// Powolny jestem :)

0

THX bula

a da sie to jakos przerobić zeby działao w obrebie calego ekranu??

0

Ja bym to napisał tak: ;)

Deklarujesz zmienną Hook typu HHOOK jako zmienna globalną i...

W kodzie przycisku:

  Hook:=SetWindowsHookEx(WH_JOURNALRECORD,  HOOKPRC, hInstance, 0); //uruchamiasz nasłuch na nacisniecie klawisza myszy

W OnClose Formy:

  UnHookWindowsHookEx(Hook);

i piszesz taką procke:

function HookPRC(Code: Integer; wParam:WPARAM; lParam: LPARAM): Longint; stdcall;
var
 MSg: TEventMsg;
 p: TPoint;
begin
 Msg:=PEventMsg(lParam)^;
 if Msg.message=WM_LBUTTONDOWN then begin
   GetCursorPos(P);
   Form1.Label1.Caption:=IntToStr(p.X)+' '+IntToStr(p.Y);
 end;
end;
0

[Error] Opcje1.pas(118): Undeclared identifier: 'HOOKPRC'

wywala takie cus:(

0

W sekcji

type

dodaj: function HookPRC(Code: Integer; wParam:WPARAM; lParam: LPARAM): Longint; stdcall;

0

[Error] Opcje1.pas(201): Incompatible types: 'regular procedure and method pointer'
[Error] Opcje1.pas(66): Unsatisfied forward or external declaration: 'TOpcje.HookPRC'

teraz takie cos:/

// inwencji trochę, a jak nie, to wyszukiwarka/google... - Ł

0

szukalem ale nic nie znalalzem moze ktos pomóc i powiedizec jak naprawic ten blad

// F1 [mf]

0

w SetWindowHookEx przed nazwą procedury (tej w parametrze) musi być @

0

juz doszedlem do tego na podstawie tego artykulu:D jednak teraz wywala mi kolejny blad
[Error] Opcje1.pas(200): Variable required

poczytalem o tym bledzie troche w pomocy ale nic z tego nie zrozumialem:(

0

ja mam tak i działa:

SetWindowsHookEx(WH_MOUSE, @MouseHook, HInstance, 0);
0

dziwne mam delphi 7
wzoce kodzik progsa to moze cos rozwiarze

unit Opcje1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ExtCtrls, StdCtrls, Menus;

type
  TOpcje = class(TForm)
    MainMenu1: TMainMenu;
    Plik1: TMenuItem;
    grupaUH: TGroupBox;
    grupaSD: TGroupBox;
    wlaczone1: TCheckBox;
    petla: TEdit;
    speed: TLabel;
    GrypaRodzaj: TGroupBox;
    typ1: TRadioButton;
    typ2: TRadioButton;
    pozX: TLabel;
    pozY: TLabel;
    EditPozX: TEdit;
    EditPozY: TEdit;
    wlaczone2: TCheckBox;
    pozX1: TLabel;
    pozY1: TLabel;
    EditPozX1: TEdit;
    EditPozY1: TEdit;
    Zakoncz1: TMenuItem;
    speed1: TLabel;
    petla1: TEdit;
    pobieranie: TButton;
    pobieranie1: TButton;
    Exuast: TButton;
    grupaHMM: TGroupBox;
    speed2: TLabel;
    pozX2: TLabel;
    pozY2: TLabel;
    petla2: TEdit;
    EditPozX2: TEdit;
    EditPozY2: TEdit;
    pobieranie2: TButton;
    grupaGFB: TGroupBox;
    speed3: TLabel;
    pozX3: TLabel;
    pozY3: TLabel;
    petla3: TEdit;
    EditPozX3: TEdit;
    EditPozY3: TEdit;
    pobieranie3: TButton;
    ZamknijOpcje1: TButton;
    wlaczone3: TCheckBox;
    wlaczone4: TCheckBox;
    CharPoz1: TButton;
    procedure Zakoncz1Click(Sender: TObject);
    procedure ZamknijOpcje1Click(Sender: TObject);
    procedure pobieranieClick(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
    procedure ExuastClick(Sender: TObject);
    procedure CharPoz1Click(Sender: TObject);
    function MouseHook(nCode: Integer; wParam: WPARAM; lParam: LPARAM): Longint; stdcall;

  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Opcje: TOpcje;
  HintHook: HHOOK;

implementation

uses exausted, charpos;


{$R *.dfm}


procedure TOpcje.Zakoncz1Click(Sender: TObject);
begin
Opcje.Close;
end;

procedure TOpcje.ZamknijOpcje1Click(Sender: TObject);
begin
Opcje.Close
end;

procedure TOpcje.pobieranieClick(Sender: TObject);
begin
//uruchamiasz nasłuch na nacisniecie klawisza myszy
HintHook:=SetWindowsHookEx(WH_MOUSE, @MouseHook, hInstance, 0);
end;

procedure TOpcje.FormClose(Sender: TObject; var Action: TCloseAction);
begin
UnHookWindowsHookEx(HintHook);
end;

function TOpcje.MouseHook(nCode: Integer; wParam: WPARAM; lParam: LPARAM): Longint; stdcall;
var
    MSg: TEventMsg;
    p: TPoint;
begin
Msg:=PEventMsg(lParam)^;
  if Msg.message=WM_LBUTTONDOWN then
  begin
   GetCursorPos(P);
EditPozX.Text := IntToStr(pozycja.X);
EditPozY.Text := IntToStr(pozycja.Y);
  end;
end;



procedure TOpcje.ExuastClick(Sender: TObject);
begin

  if typ1.Checked = True then
begin
    MaleOkno1.Wartosc1.Text := '0';
end
  else if typ2.Checked = True then
begin
    MaleOkno1.Wartosc1.Text := '1*1200';
end;
//wyswietlenie
MaleOkno1.Show;
end;

procedure TOpcje.CharPoz1Click(Sender: TObject);
begin
CharPoz.Show
end;

end.

to moze cos rozjani

0

ma być

@TOpcje.MouseHook

ale mimo to (jeśli przeczytałeś artykuł) to wiesz, że to i tak będzie Ci działać tylko wtedy gdy okno będzie aktywne. Jeśli chcesz, żeby tak nie było to musisz to napisać w dll'u

0
function @TOpcje.MouseHook(nCode: Integer; wParam: WPARAM; lParam: LPARAM): Longint; stdcall;

dalem cos takiego 
a w sekcji type 
function @MouseHook(nCode: Integer; wParam: WPARAM; lParam: LPARAM): Longint; stdcall;

i wysyala

[Error] Opcje1.pas(208): Identifier expected but '@' found

</delphi>
0

zrób tak:

w type:

function MouseHook(nCode:Integer; WParam:WPARAM; LParam:LPARAM):Longint;stdcall;

w impletation:

function TOpcje.MouseHook(nCode:Integer; WParam:WPARAM; LParam:LPARAM):Longint;stdcall;
begin
// coś
end;

a tam gdzie masz hooka:

SetWindowsHookEx(WH_MOUSE, @TOpcje.MouseHook, hinstance, 0);

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