![]() |
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... |
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? |
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...
|
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:
|
AW: SpeedButton
Ich würde z.B. den Winspector Spy empfehlen. Das bringt aber nichts, denn wie itsme bereits korrekt geschrieben hat: ;)
Zitat:
Zitat:
gruss |
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 |
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:
Egal welchen Spy du da nimmst. gruss |
AW: SpeedButton
Zitat:
![]() |
AW: SpeedButton
Liste der Anhänge anzeigen (Anzahl: 1)
Habe gerade mal mit EDA nachgeschaut, alte Leier, ohne Handle isses nix.Anhang 49402
|
AW: SpeedButton
Die "passenden" Ereignisse muß man dann doch nur an dessen Parent schicken, also den mit einem Handle. :stupid:
|
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. |
AW: SpeedButton
Auf SO habe ich eine Interessante Methode gefunden, aber vermutlich nützt das auch nichts wegen der Handle Geschichte.
Delphi-Quellcode:
Das soll es einem ermöglichen in Fremd-Anwendungen das Control unter der Maus zu ermitteln. Ich habe es noch nicht getestet.
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; |
AW: SpeedButton
Gut danke erst einmal, das werde ich testen...
|
AW: SpeedButton
Screen.Forms und Fremdanwendungen? Das halte ich für ein Gerücht.
|
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 |
AW: SpeedButton
Hallo,
![]() Da steht zumindestens was mit "gelöst" und es geht um Speedbuttons. |
AW: SpeedButton
Zitat:
|
AW: SpeedButton
Zitat:
|
AW: SpeedButton
Also ich habe mir diese Lösung mit dem Mausklick auch angeschaut.
Geht nicht und kann so auch nicht gehen...
Delphi-Quellcode:
sagt MS "Not used; must be zero." zu den letzten beiden Parametern
SendMessage(Handle, BM_CLICK, wParam, lParam);
Man kann also gar keine x und y Koordinaten angeben! |
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:
oder kürzer so, auch uralt
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;
Delphi-Quellcode:
mit SendMessage müsste es so funktionieren:
mouse_event(MOUSEEVENTF_LEFTDOWN or MOUSEEVENTF_MOVE, mouseX, mouseY, 0, 0);
mouse_event(MOUSEEVENTF_LEFTUP or MOUSE_MOVE, mouseX, mouseY, 0, 0);
Delphi-Quellcode:
edit
SendMessage(WindowFromPoint(p), WM_LBUTTONDOWN, MAKELPARAM(p.x, p.y), 0);
Zitat:
|
AW: SpeedButton
Hmm..
Besser statt mouse_event() das SendInput verwenden. Dieses kann für Tastatur und Maus verwendet werden. |
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 |
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.
|
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. |
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. |
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. |
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:
Das Tool Winspy mit integriertem Code-Generator hat mir sehr geholfen. :thumb:
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)); 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. |
AW: SpeedButton
Zitat:
![]() |
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