Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Delphi SpeedButton (https://www.delphipraxis.net/196869-speedbutton.html)

itsme 26. Jun 2018 13:11

SpeedButton
 
Gibt es eine Möglichkeit einen SpeedButton in einem anderen Programm "fernzusteuern", also betätigen, aktivieren?
Die Suche hier im Forum hat ergeben, dass SpeedButton keine "richtigen" Fenster sind, also auch kein Handle besitzen, weshalb ich gescheitert bin.

Nichtsdestotrotz muss man doch zwischen verschiedenen SpeedButtons unterscheiden können, somit könnte eine Möglichkeit bestehen, oder nicht?
Suchen googeln, natürlich auch selber Gedanken machen und Versuche starten, haben kein Ergebnis gebracht.

Irgendwie bin ich mit meinem Hobbylatein am Ende...

TiGü 26. Jun 2018 13:27

AW: SpeedButton
 
Diese Threadtitel!^^

Bietet das Programm, welches du steuern möchtest, ggf. eine Schnittstelle an, mit der du dein Problem leicht und elegant lösen könntest?
Um welches Programm handelt es sich denn?

KodeZwerg 26. Jun 2018 13:44

AW: SpeedButton
 
Mir ist leider der Name entfallen für den Window-Spy den EWeiss mal vorgeschlagen hatte, der kramt in Echtzeit wie ein Debugger alle Möglichen Informationen ans Tageslicht. Forum mal nach Window-Spy (o.ä.) durchsuchen...

jaenicke 26. Jun 2018 14:01

AW: SpeedButton
 
Leider geht das so einfach nicht. Du könntest, wenn das Tool keine anderen Möglichkeiten bietet, nur versuchen Mausklicks an die entsprechende Position zu setzen, wenn das Fenster aktiv ist. Quasi wie ein Makrorekorder.

Zitat:

Zitat von KodeZwerg (Beitrag 1405862)
Mir ist leider der Name entfallen für den Window-Spy den EWeiss mal vorgeschlagen hatte, der kramt in Echtzeit wie ein Debugger alle Möglichen Informationen ans Tageslicht. Forum mal nach Window-Spy (o.ä.) durchsuchen...

Ich würde z.B. den Window Detective empfehlen. Vermutlich meintest du WinSpy. Das bringt aber nichts, denn wie itsme bereits korrekt geschrieben hat:
Zitat:

Zitat von itsme (Beitrag 1405857)
Die Suche hier im Forum hat ergeben, dass SpeedButton keine "richtigen" Fenster sind, also auch kein Handle besitzen


EWeiss 26. Jun 2018 14:03

AW: SpeedButton
 
Ich würde z.B. den Winspector Spy empfehlen. Das bringt aber nichts, denn wie itsme bereits korrekt geschrieben hat: ;)
Zitat:

Die Suche hier im Forum hat ergeben, dass SpeedButton keine "richtigen" Fenster sind, also auch kein Handle besitzen
Zitat:

Vermutlich meintest du WinSpy.
Nein Winspector Spy :)

gruss

itsme 26. Jun 2018 15:23

AW: SpeedButton
 
Also zunächst vollkommen berechtigt, Entschuldigung für den blöden Titel... :oops:
WinSpy habe und kenne ich, echt genial, hier mein Daumen für den Autor :thumb:
Denke mal Winspector Spy hat auch kein anderes Ergebnis, SpeedButton bleibt SpeedButton, kein Handle kein Fortschritt :lol:
Und ich habe keine Ahnung von Schnittstellen eines externen Programms, es ist extern, sonst müsste ich ja nicht fragen
Wenn nichts geht, dann klicke ich halt auf den Button, ohne wäre es eleganter gewesen, da keine Anwesenheit am Rechner erforderlich

Wie dem auch sei, es geht mir nicht um Anwesenheit oder nicht, lernen will ich
Das mit dem MausClick wäre ein Ansatz, aber da muss ich erst einmal darüber nachdenken, wie man sowas realisieren kann?
Letztendlich ist das ein fremdes Programm, da habe ich keinerlei Informationen darüber, wie gesagt nicht wichtig, aber eine Herausforderung

Aber vlt. sollte ich doch lieber "Hello World" in der 129igsten Version programmieren, da muss ich hier nicht fragen ROFL

EWeiss 26. Jun 2018 15:47

AW: SpeedButton
 
Die frage wäre da noch wie speichert das Programm den Inhalt vom Speed Button.
Es muss ja irgendwoher die werte erhalten bzw. gegenprüfen.
Wenn die Daten in einer Ini gespeichert werden dürfte es kein Problem sein den Eintrag zu verändern.

Die frage ist nur ist diese geöffnet, hast du zugriff darauf und vor allem wie oft prüft das Teil den aktuellen wert.
Zitat:

Denke mal Winspector Spy hat auch kein anderes Ergebnis, SpeedButton bleibt SpeedButton, kein Handle kein Fortschritt
Da muss man sich auch nicht weiter drüber auslassen denn das sollte wohl klar sein ohne Handle geht da nix.
Egal welchen Spy du da nimmst.

gruss

jaenicke 26. Jun 2018 20:28

AW: SpeedButton
 
Zitat:

Zitat von itsme (Beitrag 1405876)
Wenn nichts geht, dann klicke ich halt auf den Button, ohne wäre es eleganter gewesen, da keine Anwesenheit am Rechner erforderlich

Das klingt so als würde dir schon ein ganz normaler Makrorekorder wie dieser vielleicht reichen...

KodeZwerg 26. Jun 2018 22:00

AW: SpeedButton
 
Liste der Anhänge anzeigen (Anzahl: 1)
Habe gerade mal mit EDA nachgeschaut, alte Leier, ohne Handle isses nix.Anhang 49402

himitsu 27. Jun 2018 09:24

AW: SpeedButton
 
Die "passenden" Ereignisse muß man dann doch nur an dessen Parent schicken, also den mit einem Handle. :stupid:

itsme 27. Jun 2018 11:45

AW: SpeedButton
 
@himitsu
Also Parent ist ein TabSheet, da habe ich das Ereignis hingeschickt, trotzdem hat sich nichts getan.
Auf diesem TabSheet sind im übrigen 3 SpeedButton, selbst wenn das funktioniert hätte, wie hätte Parent dann gewusst, welcher SpeedButton gemeint ist?

Ich muss dann wohl zur Kenntnis nehmen, dass es nicht geht, Makro wäre vlt. eine Möglichkeit...
Es ging und geht natürlich auch ohne irgendeine Lösung, wieder ein wenig mit Delphi arbeiten, stand hier im Vordergrund.

KodeZwerg 27. Jun 2018 11:51

AW: SpeedButton
 
Auf SO habe ich eine Interessante Methode gefunden, aber vermutlich nützt das auch nichts wegen der Handle Geschichte.
Delphi-Quellcode:
function FindSubcontrolAtPos(AControl: TControl; AScreenPos, AClientPos: TPoint): TControl;
var
  i: Integer;
  C: TControl;
begin
  Result := nil;
  C := AControl;
  if (C=nil) or not C.Visible or not TRect.Create(C.Left, C.Top, C.Left+C.Width, C.Top+C.Height).Contains(AClientPos) then
    Exit;
  Result := AControl;
  if AControl is TWinControl then
    for i := 0 to TWinControl(AControl).ControlCount-1 do
    begin
      C := FindSubcontrolAtPos(TWinControl(AControl).Controls[i], AScreenPos, AControl.ScreenToClient(AScreenPos));
      if C<>nil then
        Result := C;
    end;
end;

function FindControlAtPos(AScreenPos: TPoint): TControl;
var
  i: Integer;
  f,m: TForm;
  p: TPoint;
  r: TRect;
begin
  Result := nil;
  for i := Screen.FormCount-1 downto 0 do
    begin
      f := Screen.Forms[i];
      if f.Visible and (f.Parent=nil) and (f.FormStyle<>fsMDIChild) and
        TRect.Create(f.Left, f.Top, f.Left+f.Width, f.Top+f.Height).Contains(AScreenPos)
      then
        Result := f;
    end;
  Result := FindSubcontrolAtPos(Result, AScreenPos, AScreenPos);
  if (Result is TForm) and (TForm(Result).ClientHandle<>0) then
  begin
    WinAPI.Windows.GetWindowRect(TForm(Result).ClientHandle, r);
    p := TPoint.Create(AScreenPos.X-r.Left, AScreenPos.Y-r.Top);
    m := nil;
    for i := TForm(Result).MDIChildCount-1 downto 0 do
    begin
      f := TForm(Result).MDIChildren[i];
      if TRect.Create(f.Left, f.Top, f.Left+f.Width, f.Top+f.Height).Contains(p) then
        m := f;
    end;
    if m<>nil then
      Result := FindSubcontrolAtPos(m, AScreenPos, p);
  end;
end;
Das soll es einem ermöglichen in Fremd-Anwendungen das Control unter der Maus zu ermitteln. Ich habe es noch nicht getestet.

itsme 27. Jun 2018 11:59

AW: SpeedButton
 
Gut danke erst einmal, das werde ich testen...

DeddyH 27. Jun 2018 12:00

AW: SpeedButton
 
Screen.Forms und Fremdanwendungen? Das halte ich für ein Gerücht.

itsme 27. Jun 2018 12:20

AW: SpeedButton
 
Ja bei näherem hinschauen kann man es wohl tatsächlich nicht für eine Fremdanwendung benutzen.

Hatte eigentlich auch keine Hoffnung mehr, nachdem ich hier gelesen hatte, dass Speedbutton kein Handle haben, weil sie nur "aufgemalt" sind.
Trotzdem vielen Dank für die Versuche mir zu helfen.
Ich denke ich werde in dieser Hinsicht ab sofort alle Tätigkeiten einstellen.

Es war jedenfalls ganz interessant zu sehen, wie Autofill Programme so werkeln.
Edit lesen und schreiben, normale Buttons betätigen hat alles wunderbar geklappt und ich eine Menge dazu gelernt

hoika 27. Jun 2018 17:33

AW: SpeedButton
 
Hallo,
https://www.experts-exchange.com/que...plication.html

Da steht zumindestens was mit "gelöst" und es geht um Speedbuttons.

jaenicke 27. Jun 2018 18:01

AW: SpeedButton
 
Zitat:

Zitat von hoika (Beitrag 1405971)
Da steht zumindestens was mit "gelöst" und es geht um Speedbuttons.

Klar, mit der Simulation der Mauseingabe klappt es ja auch. Das ist dort die Lösung.

KodeZwerg 27. Jun 2018 20:05

AW: SpeedButton
 
Zitat:

Zitat von DeddyH (Beitrag 1405943)
Screen.Forms und Fremdanwendungen? Das halte ich für ein Gerücht.

Du hast natürlich Recht! Was ich im Hinterkopf hatte und nicht dazugeschrieben weil ich ein wenig in Eile war, dieses Beispiel da oben, da wird ja schön mit WinControl rumhantiert und ich weiß das man bei Fremdanwendungen so vorgehen kann (der obere Code-Teil) ich habe gehofft das man es mit GraphicControl hätte umschreiben können, jedenfalls war das mein Anlass es zu posten.

itsme 28. Jun 2018 12:27

AW: SpeedButton
 
Also ich habe mir diese Lösung mit dem Mausklick auch angeschaut.
Geht nicht und kann so auch nicht gehen...

Delphi-Quellcode:
SendMessage(Handle, BM_CLICK, wParam, lParam);
sagt MS "Not used; must be zero." zu den letzten beiden Parametern
Man kann also gar keine x und y Koordinaten angeben!

KodeZwerg 28. Jun 2018 15:19

AW: SpeedButton
 
Du positionierst die Mausposition selber vorher! Das hat nichts mit "klick" zu tun!

Uraltes Beispiel für Links und Rechtsklick an beliebiger Position:
Delphi-Quellcode:
procedure LeftClick(mouseX,mouseY:Word;ResetMouse:Boolean=False;Relative:Boolean=True);
var p:TPoint;
    win:HWND;
    wRect:TRect;
begin
  GetCursorPos(p);
  if Relative then
  begin
    win:=GetForegroundWindow;
    GetWindowRect(win,wRect);
    mouseX:=mouseX+wRect.Left;
    mouseY:=mouseY+wRect.Top;
  end;
  SetCursorPos(mouseX,mouseY);
  mouse_event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0);
  mouse_event(MOUSEEVENTF_LEFTUP, 0, 0, 0, 0);
  if ResetMouse then SetCursorPos(p.x,p.y);
end;

procedure RightClick(mouseX,mouseY:Word;ResetMouse:Boolean=False;Relative:Boolean=True);
var p:TPoint;
    win:HWND;
    wRect:TRect;
begin
  GetCursorPos(p);
  if Relative then
  begin
    win:=GetForegroundWindow;
    GetWindowRect(win,wRect);
    mouseX:=mouseX+wRect.Left;
    mouseY:=mouseY+wRect.Top;
  end;
  SetCursorPos(mouseX,mouseY);
  mouse_event(MOUSEEVENTF_RIGHTDOWN, 0, 0, 0, 0);
  mouse_event(MOUSEEVENTF_RIGHTUP, 0, 0, 0, 0);
  if ResetMouse then SetCursorPos(p.x,p.y);
end;
oder kürzer so, auch uralt
Delphi-Quellcode:
mouse_event(MOUSEEVENTF_LEFTDOWN or MOUSEEVENTF_MOVE, mouseX, mouseY, 0, 0);
mouse_event(MOUSEEVENTF_LEFTUP or MOUSE_MOVE, mouseX, mouseY, 0, 0);
mit SendMessage müsste es so funktionieren:
Delphi-Quellcode:
SendMessage(WindowFromPoint(p), WM_LBUTTONDOWN, MAKELPARAM(p.x, p.y), 0);
edit
Zitat:

Zitat von HolgerX (Beitrag 1406054)
Besser statt mouse_event() das SendInput verwenden.
Dieses kann für Tastatur und Maus verwendet werden.

Das wollte ich hier noch mit erwähnt haben da mein Beispiel Ur-Alt ist! Danke @HolgerX

HolgerX 28. Jun 2018 15:31

AW: SpeedButton
 
Hmm..

Besser statt mouse_event() das SendInput verwenden.
Dieses kann für Tastatur und Maus verwendet werden.

KodeZwerg 28. Jun 2018 15:37

AW: SpeedButton
 
Hab Deinen Hinweis mit rangepappt, nun sollte jeder Zufrieden sein, Danke für diese Information! @ HolgerX
Habs gerade mit D2009 nochmal getestet, es läuft mit Windows 10. Danke @ API

API 28. Jun 2018 15:49

AW: SpeedButton
 
mouse_event() gibt es momentan noch, wurde aber durch SendInput ersetzt. Das Beispiel würde ich nicht löschen, denn es funktioniert ja so noch.

itsme 29. Jun 2018 12:01

AW: SpeedButton
 
@KodeZwerg

Auch wenn ich eigentlich Schluss machen wollte, beschäftigt mich das Thema trotzdem weiter...
Werde deine Lösung sicherlich auch ausprobieren, hatte an sowas ähnliches auch schon gedacht

Ich wollte eigentlich per Sendmessage eine WM_LButtonDown Nachricht mal testen, bin aber noch nicht dazu gekommen

Bei allen Vorschlägen hier, insbesondere deinem letzten, sollte man nicht vergessen, es muss mit einem Fremdprogramm funktionieren.
Man kann natürlich in diesem Fremdprogramm per Hexeditor für entsprechenden SpeedButton Left, Top, Width, Height auslesen und bei LButtonDown angeben.
Keine Ahnung ob es funktionieren würde, zumindest kommen mir die ausgelesenen Werte für Left und Top ziemlich falsch vor, wenn ich mal die Dimensionen des TabSheet zu Grunde lege

Stochern im Nebel, oder probieren geht über studieren, mag trotzdem zum Erfolg führen, nur hängt mein ganzes Leben nicht an diesem Problem. :lol:
Es ist schön etwas nach viel Mühen gelöst zu haben, aber wenn nicht, dann suche ich mir trotzdem nicht gleich ein anderes Hobby.

KodeZwerg 29. Jun 2018 13:08

AW: SpeedButton
 
Diese drei funktionen solltest du vereinen, in meinem Beispiel kannst Du ja lesen wie ich Relative/Absolute x&y Werte behandel.
SetForegroundWindow() - damit das Fremdprogramm nach vorne holen, sonst klickst Du vielleicht an falscher Stelle
SetCursorPos() - damit die Maus auf Ziel-Koordinaten einstellen
SendInput() - damit einen klick simulieren

All das hat absolut nichts mit Fremdprogramm-Fernsteuern am Hut, das ist einfach nur ein nachahmen von Dingen die Du sonst alleine mit Maus- Bewegung und klicks machen würdest. Solange es Sinn und Zweck erfüllt, nur zu.

itsme 29. Jun 2018 13:22

AW: SpeedButton
 
Ok ich werde mich da demnächst mal daran machen und mich dazu äußern.

Momentan nervt leider ein Sohn...
Der ist ständig irgendwie mit "Project Euler" beschäftigt.
Wer da nicht kennt, kann gerne einen Link posten.

Ich bin da mit Mühe und Not bis 10 gekommen, geht eigentlich weniger um programmieren, ist mehr Mathematik

Der hat es in Mathe drauf und hofft bei mir auf Delphi, C und Asm
Letzteres hatte ich früher mal gemacht, ist schon lange her, nichts mehr vorhanden
Hobby und Arbeit lassen sich nicht unbedingt vereinbaren und nach "endlich" Rentner, fehlt auch die Lust früheres Wissen neu aufzuwärmen.

Wahrscheinlich werden mich nun ein paar Leute steinigen, aber trotzdem, ich finde Delphi schwer genug, da braucht's kein Euler und auch keine anderen Programmiersprachen.

itsme 1. Jul 2018 13:49

AW: SpeedButton
 
So es funktioniert jetzt, war aber trotzdem nicht so ganz einfach, da man mit unterschiedlichen Koordinaten arbeiten muss.
Da soll einer darauf kommen, aber man hat gelernt und das ist die Hauptsache...

Delphi-Quellcode:
SetCursorPos(nPMain.x, nPMain.y);
SendMessage(WindowFromPoint(nPMain), WM_LBUTTONDOWN, MK_LBUTTON, MAKELPARAM(nPBtn.x, nPBtn.y));
SendMessage(WindowFromPoint(nPMain), WM_LBUTTONUP, 0, MAKELPARAM(nPBtn.x, nPBtn.y));
Das Tool Winspy mit integriertem Code-Generator hat mir sehr geholfen. :thumb:

Als ich die Hoffnung schon aufgegeben hatte, dass sowas überhaupt funktionieren kann, habe ich auch mit dem Free Tool "Move Mouse" herumgespielt und gesehen: Es geht!

Wer da also nichts selber machen möchte und ggf. einen Automatismus haben möchte, sollte einfach mal danach googeln.
Ich selbst hatte es wohl von Computerbild heruntergeladen, ist also nicht schwer zu finden.

KodeZwerg 1. Jul 2018 14:38

AW: SpeedButton
 
Zitat:

Zitat von itsme (Beitrag 1406230)
Wer da also nichts selber machen möchte und ggf. einen Automatismus haben möchte, sollte einfach mal

diese fertige alternative auch in Betracht ziehen :lol:


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:05 Uhr.

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