AGB  ·  Datenschutz  ·  Impressum  







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

SpeedButton

Ein Thema von itsme · begonnen am 26. Jun 2018 · letzter Beitrag vom 1. Jul 2018
Antwort Antwort
itsme

Registriert seit: 3. Aug 2006
32 Beiträge
 
Delphi XE Architect
 
#1

AW: SpeedButton

  Alt 28. Jun 2018, 12:27
Also ich habe mir diese Lösung mit dem Mausklick auch angeschaut.
Geht nicht und kann so auch nicht gehen...

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!
  Mit Zitat antworten Zitat
Benutzerbild von KodeZwerg
KodeZwerg

Registriert seit: 1. Feb 2018
3.691 Beiträge
 
Delphi 11 Alexandria
 
#2

AW: SpeedButton

  Alt 28. Jun 2018, 15:19
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:
SendMessage(WindowFromPoint(p), WM_LBUTTONDOWN, MAKELPARAM(p.x, p.y), 0); edit
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
Gruß vom KodeZwerg

Geändert von KodeZwerg (28. Jun 2018 um 15:55 Uhr)
  Mit Zitat antworten Zitat
HolgerX

Registriert seit: 10. Apr 2006
Ort: Leverkusen
984 Beiträge
 
Delphi 6 Professional
 
#3

AW: SpeedButton

  Alt 28. Jun 2018, 15:31
Hmm..

Besser statt mouse_event() das SendInput verwenden.
Dieses kann für Tastatur und Maus verwendet werden.
  Mit Zitat antworten Zitat
Benutzerbild von KodeZwerg
KodeZwerg

Registriert seit: 1. Feb 2018
3.691 Beiträge
 
Delphi 11 Alexandria
 
#4

AW: SpeedButton

  Alt 28. Jun 2018, 15:37
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
Gruß vom KodeZwerg

Geändert von KodeZwerg (28. Jun 2018 um 15:57 Uhr)
  Mit Zitat antworten Zitat
API

Registriert seit: 18. Apr 2004
637 Beiträge
 
#5

AW: SpeedButton

  Alt 28. Jun 2018, 15:49
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.
  Mit Zitat antworten Zitat
itsme

Registriert seit: 3. Aug 2006
32 Beiträge
 
Delphi XE Architect
 
#6

AW: SpeedButton

  Alt 29. Jun 2018, 12:01
@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.
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.
  Mit Zitat antworten Zitat
Benutzerbild von KodeZwerg
KodeZwerg

Registriert seit: 1. Feb 2018
3.691 Beiträge
 
Delphi 11 Alexandria
 
#7

AW: SpeedButton

  Alt 29. Jun 2018, 13:08
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.
Gruß vom KodeZwerg
  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 00:09 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