Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Emulierter Mausklick bugt (https://www.delphipraxis.net/154256-emulierter-mausklick-bugt.html)

kerkerst 3. Sep 2010 09:32

Emulierter Mausklick bugt
 
Hey,
Ich versuche einen Mausklick zu emulieren, dafür gibts ja Mouse_Events. Die funktionieren auch Prima in einer einzelnen Anwendung (meine Testanwendung um sie zu testen), die sonst nix tut. Dazu lasse ich mir n Screenshot generieren, in ein Image laden, und wenn ich nu iwo aufs Image klicke, springt der Mauszeiger auch dorthin und klickt.
Das habe ich dann auch in ein weiteres Programm eingebaut, einen Remote Desktop Viewer. Dort tut sich allerdings leider nix. Wenn ich das Springen und Klicken des Mauszeigers steppe (F7) funktioniert es. Aber sobald ich es normal durchlaufen lasse tut sich nix. Nur wenn ich das Programm auf dem zu betrachtenden PC als Admin starte funktioniert es ganz normal.
Delphi-Quellcode:
       
SetCursorPos(x,y);
mouse_event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0);
mouse_event(MOUSEEVENTF_LEFTUP, 0, 0, 0, 0);
und
Delphi-Quellcode:
  Inp.Itype := INPUT_MOUSE;
  Inp.mi.dwFlags := MOUSEEVENTF_LEFTDOWN or MOUSEEVENTF_ABSOLUTE or MOUSEEVENTF_MOVE;
  Inp.mi.dx := round(xPos * (65535 / Screen.Width));
  Inp.mi.dy := round(yPos * (65535 / Screen.Height));
  Inp.mi.time := 0;
  Inp.mi.dwExtraInfo := 0;
  SendInput(1, Inp, SizeOf(Inp));

  Inp.Itype := INPUT_MOUSE;
  Inp.mi.dwFlags := MOUSEEVENTF_LEFTUP or MOUSEEVENTF_ABSOLUTE or MOUSEEVENTF_MOVE;
  Inp.mi.dx := round(xPos * (65535 / Screen.Width));
  Inp.mi.dy := round(yPos * (65535 / Screen.Height));
  Inp.mi.time := 0;
  Inp.mi.dwExtraInfo := 0;
  SendInput(1, Inp, SizeOf(Inp));
habe ich bisher dafür probiert. Auch ProcessMessage für 20-500ms zwischen SetCursorPos und den Mouse_events haben nicht geholfen.
Vielleicht kann mir ja jemand helfen oder hat eine andere Alternative die ich dafür benutzen kann.
Ich benutze D7 / Win7. Auf Vista gibs jedoch das selbe Verhalten.

mfG
Stephan

SirThornberry 3. Sep 2010 09:36

AW: Emulierter Mausklick bugt
 
Bei mir hat das bisher immer wunderbar funktioniert. Allerdings habe ich niemals das Mouse-Down und das Mouse-Up direkt hintereinander gesendet. Probiere einfach mal ob das ganze funktioniert wenn du es mit einer realistischen Zeitdifferenz ausführst.

blackfin 3. Sep 2010 09:44

AW: Emulierter Mausklick bugt
 
----falscher thread *peinlich*---

kerkerst 3. Sep 2010 09:52

AW: Emulierter Mausklick bugt
 
Danke für deine schnelle Antwort. Was verstehst du unter "realistischer" Zeitdifferenz? Wie gesagt, hab schon alle möglichen Werte zwischen 20 und 500ms zwischen den Mouse_events mitm Application.ProcessMessage "gefüllt". Und das direkt hintereinander senden funktioniert. Meine TestApp macht ja nichts anderes.

Hier mal der Code der TestApp, mit der es einwandfrei funktioniert.
Delphi-Quellcode:
unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    Image1: TImage;
    Button1: TButton;
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    Label4: TLabel;
    procedure Button1Click(Sender: TObject);
    procedure Image1MouseMove(Sender: TObject; Shift: TShiftState; X,
      Y: Integer);
    procedure Image1Click(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;
  w,h:integer;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
Image1.Picture.LoadFromFile('C:\Users\RaZoR\Desktop\Unbenannt.bmp');
end;

procedure TForm1.Image1MouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
begin
Label1.Caption:='X: '+inttostr(x);
w:=x;
Label2.Caption:='Y: '+inttostr(y);
h:=y;
end;

procedure TForm1.Image1Click(Sender: TObject);
var xFactor:real;
    yFactor:real;
    MousePoint:TPoint;
    xstor,ystor:integer;
    xRelation,yRelation:real;
begin
xFactor:=Image1.Picture.Width / Image1.Width;
yFactor:=Image1.Picture.Height / Image1.Height;
xRelation:=Screen.Width / Image1.Picture.Width;
yRelation:=Screen.Height / Image1.Picture.Height;
Label3.Caption:='XFaktor: '+floattostr(xfactor);
Label4.Caption:='yFaktor: '+floattostr(yfactor);
GetCursorPos(MousePoint);
xStor:=MousePoint.X;
yStor:=MousePoint.Y;
SetCursorPos(Round(w*xFactor*xRelation),Round(h*yFactor*yRelation));
mouse_event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0);
mouse_event(MOUSEEVENTF_LEFTUP, 0, 0, 0, 0);
SetCursorPos(xStor,yStor);
end;

end.
Wie gesagt, funktionieren tut es in dem moment nicht, wenn ich den Befehl zum setzen der Mausposition und dann klicken an den Remote-PC schicke (ausser wenn das Programm aufm RemotePC als Admin ausgeführt wird, oder ich es via Delphi einzeln durchsteppe).


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:13 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz