Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Klick in Programmbereich Simulieren (https://www.delphipraxis.net/203532-klick-programmbereich-simulieren.html)

jacky213 26. Feb 2020 18:24

Klick in Programmbereich Simulieren
 
Hallo,

ich versuche mich daran ein minimiertes Programm zu steuern. xSpy zeigt mir beim Button namen Nil an, also dachte ich daran in dem Programm einfach auf eine bestimmte X Y Position zu Klicken. Kann mir da jemand helfen?

ein Ansatz hierfür wäre echt nett.

Das Programm muss allerdings im Hintergrund bleiben

Danke

DieDolly 26. Feb 2020 18:25

AW: Klick in Programmbereich Simulieren
 
Zitat:

ich versuche mich daran ein minimiertes Programm zu steuern.
Wie willst du ein nicht sichtbares Control anklicken? Gar nicht. Besonders nicht, weil es nicht dein Programm ist.

Der schöne Günther 26. Feb 2020 18:28

AW: Klick in Programmbereich Simulieren
 
Wenn du wirklich konkret einen "Mausklick an Stelle X|Y" simulieren willst kannst du das einfach mit SendInput machen. Aber ich glaube auch, das ist nicht was du wirklich willst. Vielleicht kannst du deine Anforderung etwas genauer beschreiben.

jacky213 26. Feb 2020 18:40

AW: Klick in Programmbereich Simulieren
 
ich habe das Windows Handle und an dieses Fenster möchte ich an Position X Y einen Klick schicken.

Ist das konkreter?

Der schöne Günther 26. Feb 2020 18:43

AW: Klick in Programmbereich Simulieren
 
--- vorschnell getippt. Erst denken, dann tippen ---

jacky213 26. Feb 2020 19:20

AW: Klick in Programmbereich Simulieren
 
Sofern es hilft, mir wird von xspy die ControlID angezeigt. Kann ich den Klick zu dieser ControlID senden oder über diese das richtige Handle ermitteln?

jacky213 26. Feb 2020 22:53

AW: Klick in Programmbereich Simulieren
 
ich bekomme zu dem button kein Handle, weder mit WinSpy noch mit xSpy, gibt es irgendeine andere Methode um daran zu kommen?

Medium 26. Feb 2020 23:53

AW: Klick in Programmbereich Simulieren
 
Wenn der Button kein Handle liefert, ist es kein natives Windows-Control (das Nachrichten empfangen könnte). Was in Folge heißt: Sofern es keine explizite Schnittstelle vom zu steuernden Programm gibt, hast du schlechte Karten es ohne Umweg über die Darstellung zu steuern. Was desweiteren heißt: Ohne sichtbares Fenster und definierte Maus-Koordinaten = sieht schlecht aus für dich.

Luckie 27. Feb 2020 02:30

AW: Klick in Programmbereich Simulieren
 
Um was für ein Programm handelt es sich denn? Und was tut es? Vielleicht kommt man ja auf anderen Weg zum Ziel.

stahli 27. Feb 2020 07:58

AW: Klick in Programmbereich Simulieren
 
Ist das ein selbst entwickeltes Programm oder ein fremdes?

jacky213 27. Feb 2020 20:37

AW: Klick in Programmbereich Simulieren
 
Es ist ein Waren wirtschafts Programm. Es ist nicht von mir. Es hat ein Tastenfeld inwelchem man die EAN eingeben kann um nach Kommissionierten Artikeln zu suchen. Anstatt nun jede Nummer einzeln einzugeben, wollte ich eine Liste abarbeiten lassen und immer wenn ich auf weiter klicke sollte die nächste Nummer eingegeben und gesucht werden.

Zur Zeit bekomme ich nur das Handle der hauptform und jeder Button welcher sich auf der Form selbst befindet wird mir als TButton angezeigt, ich bekomme einfach kein eindeutiges Handle. Nur die ControlID ist bei jedem Button anders.

jacky213 27. Feb 2020 22:33

AW: Klick in Programmbereich Simulieren
 
Es muss nicht zwingend im Hintergrund sein wenn es hilft. Ich habe jetzt mittels Coursor Positionierung und dem Code geschafft das sich was tut, allerdings reagieren einige Buttons trotzdem nicht auf den Klick, wenn ich aber mit der Maus dorthin Klicke dann funktioniert es. Keine Ahnung woran es liegt.

Delphi-Quellcode:
Procedure ClickNow;
var
eu: array [0..1] of TInput;
begin
  SetCursorPos(strtoint(form2.ListView1.Selected.SubItems[0]),
               strtoint(form2.ListView1.Selected.SubItems[1]));
  ZeroMemory(@eu,sizeof(eu));
  eu[0].Itype := INPUT_MOUSE;
  eu[0].mi.dwFlags :=MOUSEEVENTF_LEFTDOWN;
  eu[1].Itype := INPUT_MOUSE;
  eu[1].mi.dwFlags :=MOUSEEVENTF_LEFTUP;
  SendInput(2,eu[0],sizeof(TInput));
end;

stahli 28. Feb 2020 08:34

AW: Klick in Programmbereich Simulieren
 
Ich habe mal vor vielen Jahren etwas ähnliches gemacht und an eine Anwendung "Tastatur-Ereignisse" geschickt. Hoch, Runter, Tabs und Buchstaben.
Funktioniert hatte das bedingt, aber konkret helfen kann ich Dir leider hier nicht.

jacky213 28. Feb 2020 08:39

AW: Klick in Programmbereich Simulieren
 
Die Koordinaten stimmen, gibt es die Möglichkeit einen richtigen Hardware Maus Klick zu simulierten?

KodeZwerg 28. Feb 2020 08:50

AW: Klick in Programmbereich Simulieren
 
oldschool methode von www.swissdelphicenter.ch

Delphi-Quellcode:
// Set the mouse cursor to position x,y:
// Maus an Position x,y setzen:
SetCursorPos(x, y);

// Simulate the left mouse button down
// Linke Maustaste simulieren
mouse_event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0);
mouse_event(MOUSEEVENTF_LEFTUP, 0, 0, 0, 0);

// Simulate the right mouse button down
// Rechte Maustaste simulieren
mouse_event(MOUSEEVENTF_RIGHTDOWN, 0, 0, 0, 0);
mouse_event(MOUSEEVENTF_RIGHTUP, 0, 0, 0, 0);

// Simulate a double click
// Einen Doppelklick simulieren
mouse_event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0);
mouse_event(MOUSEEVENTF_LEFTUP, 0, 0, 0, 0);
GetDoubleClickTime;
mouse_event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0);
mouse_event(MOUSEEVENTF_LEFTUP, 0, 0, 0, 0);

// Simulate a double click on a panel
// Einen Doppelklick auf einen Panel simulieren
SendMessage(Panel1.Handle, WM_LBUTTONDBLCLK, 10, 10);

jacky213 28. Feb 2020 11:52

AW: Klick in Programmbereich Simulieren
 
Ich habe jetzt mal eine Maus an den Rechner angeschlossen weil mich der Touch einfach mal total nervt und als ich damit am arbeiten war wurden selbst echte klicks mit der Maus teilweise nicht mehr angenommen?!?

Aber wirklich nur auf manchen Tasten des Nummernblocks auf dem Display, Touch funktionierte bis jetzt ohne jemals Probleme gemacht zu haben.

Sehr komisch

jacky213 28. Feb 2020 20:11

AW: Klick in Programmbereich Simulieren
 
kann das System zwischen echten Touch auf dem Bildschirm und einem mouse_event via Delphi Tool unterscheiden?

Luckie 28. Feb 2020 20:16

AW: Klick in Programmbereich Simulieren
 
Zitat:

Zitat von jacky213 (Beitrag 1458628)
kann das System zwischen echten Touch auf dem Bildschirm und einem mouse_event via Delphi Tool unterscheiden?

Ich frage noch mal.

jacky213 29. Feb 2020 03:01

AW: Klick in Programmbereich Simulieren
 
Was das Programm macht hab ich schon beschrieben falls du das meinst.

jacky213 29. Feb 2020 10:51

AW: Klick in Programmbereich Simulieren
 
Das ist ein guter Ansatz! Vielen Dank Frühlingsrolle

DualCoreCpu 1. Mär 2020 08:45

AW: Klick in Programmbereich Simulieren
 
Zitat:

Zitat von KodeZwerg (Beitrag 1458585)
oldschool methode von www.swissdelphicenter.ch

Delphi-Quellcode:
// Set the mouse cursor to position x,y:
// Maus an Position x,y setzen:
SetCursorPos(x, y);

// Simulate the left mouse button down
// Linke Maustaste simulieren
mouse_event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0);
mouse_event(MOUSEEVENTF_LEFTUP, 0, 0, 0, 0);

// Simulate the right mouse button down
// Rechte Maustaste simulieren
mouse_event(MOUSEEVENTF_RIGHTDOWN, 0, 0, 0, 0);
mouse_event(MOUSEEVENTF_RIGHTUP, 0, 0, 0, 0);

// Simulate a double click
// Einen Doppelklick simulieren
mouse_event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0);
mouse_event(MOUSEEVENTF_LEFTUP, 0, 0, 0, 0);
GetDoubleClickTime;
mouse_event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0);
mouse_event(MOUSEEVENTF_LEFTUP, 0, 0, 0, 0);

// Simulate a double click on a panel
// Einen Doppelklick auf einen Panel simulieren
SendMessage(Panel1.Handle, WM_LBUTTONDBLCLK, 10, 10);

Von MOUSEEVENTF_LEFTDOWN und MOUSEEVENTF_LEFTUP habe ich bisher noch gar nichts gehört oder gelesen. WO sind diese Konstanten definiert? Und wie arbeiten die mouse_event() funktionen. Oder gibt es die irgendwo schon?

@Frühlingsrolle: Super! Danke auch von mir! So etwas suche ich auch gerade.

himitsu 1. Mär 2020 10:55

AW: Klick in Programmbereich Simulieren
 
Dort, wo alle WindowsAPIs zu finden sind.
https://docs.microsoft.com/en-us/win...er-mouse_event

Zuerst in der Windows.pas suchen und wenn nicht, dann kann man noch im $(BDS)-Pfad suchen oder nimmt eine Header-Konvertion von jemand anderem oder kopiert es sich selbst aus der Dokumentation.

API 1. Mär 2020 11:04

AW: Klick in Programmbereich Simulieren
 
Die mouse_event() Funktion wurde schon lange durch SendInput() ersetzt.
https://docs.microsoft.com/de-de/win...user-sendinput


Alle Zeitangaben in WEZ +1. Es ist jetzt 11:44 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