Delphi-PRAXiS
Seite 2 von 3     12 3      

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 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


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:26 Uhr.
Seite 2 von 3     12 3      

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