![]() |
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:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:26 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