AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Emulierter Mausklick bugt

Ein Thema von kerkerst · begonnen am 3. Sep 2010 · letzter Beitrag vom 3. Sep 2010
Antwort Antwort
kerkerst

Registriert seit: 21. Feb 2007
Ort: Stodo
4 Beiträge
 
#1

Emulierter Mausklick bugt

  Alt 3. Sep 2010, 10:32
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
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#2

AW: Emulierter Mausklick bugt

  Alt 3. Sep 2010, 10:36
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.
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
blackfin
(Gast)

n/a Beiträge
 
#3

AW: Emulierter Mausklick bugt

  Alt 3. Sep 2010, 10:44
----falscher thread *peinlich*---
  Mit Zitat antworten Zitat
kerkerst

Registriert seit: 21. Feb 2007
Ort: Stodo
4 Beiträge
 
#4

AW: Emulierter Mausklick bugt

  Alt 3. Sep 2010, 10:52
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).
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:51 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