Entwickler-Ecke

Windows API - Fremdprogramm Button drücken


Stübi - Do 21.10.04 11:22
Titel: Fremdprogramm Button drücken
Hallo Zusammen

Ich versuche über mein Programm, in einem anderen Programm einen Bitbutton (Name: Senden) zu drücken.
Den Hander des Fremdprogrammes habe ich herausgefunden und übergebe ihn der Procedure über die Variabel HandlerWind.
Wenn ich die untenstehende procedure ausführe bekomme ich beim Handler Handlerbtn keine Rückgabe (das Fremdprogramm existiert 100%ig) woran könnte das liegen?

Procedure

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
procedure TfrmTest.Remote(HandlerWind : HWND);  
var  
  HandlerBTN : HWND;  
begin  
  SendMessage(HandlerWind,WM_SYSCOMMAND,SC_RESTORE,0);  
  SetForegroundWindow(HandlerWind);  
  Handlerbtn := FindWindowEx(HandlerWind,0,nil,'Senden ');  
  SendMessage(Handlerbtn,WM_LBUTTONDOWN,0,0);  
  SendMessage(Handlerbtn,WM_LBUTTONUP,0,0);  
end;





Danke für eure Antwort

Gruss Stübi


toms - Do 21.10.04 12:00

Hi,

Probier's mal mit PostMessage(HHandlerbtn, BM_CLICK, 00);

Ein allgemeiner Vorschlag zu "Fremdprogramm Button drücken" findest du hier:

http://www.swissdelphicenter.ch/de/showcode.php?id=727


Stübi - Do 21.10.04 13:00

Danke erstmals für deine Antwort,

Das Problem besteht aber weiter: Ich bekomme den Handler des Buttons gar nicht raus. Ich suche mit der FindWindowEx nach der Caption dieses Button und dieser heisst sicher Senden ist kein Hotkey und hat auch kein Ambresand.

Gruss Stübi


opfer.der.genauigkeit - Do 21.10.04 13:16

Wenn diese funktion


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
  WindowHandle := FindWindow(nil, PChar('TestFormular'));
  if WindowHandle <> 0 then
  begin
    hBtn := FindWindowEx(WindowHandle, 0nil'OK'); // oder '&OK' je nach Beschriftung
    if hBtn <> 0 then
    begin
       SendMessage(hBtn, BM_CLICK, 00);
    end;
  end;


kein ergebnis bringt, dann hol dir mal Spy- X, dann kriegste nämlich die richtige Beschriftung des Buttons raus. Is hier irgendwo im Forum zu finden.
Mußt danach suchen. :D

Moderiert von user profile iconChristian S.: Code- durch Delphi-Tags ersetzt.


Stübi - Do 21.10.04 13:52

Hallo

Ok habe mir X-Spy heruntergeladen und gestartet, gutes Programm muss ich sagen.
Wenn ich nun mit dem FindWindow Fadenkreuz auf mein Programm fahre, dass ich kontrollieren will, sehe ich sämtliche Fenstertittel und Captions Hanlder und so weiter. Doch wenn ich auf den Button fahre zeigt mir x-Spy den Handler, Caption und Fenstertext der Hauptform an! :cry:
Wie geht sowas? :?:

Danke für jegliche Antworten

Stübi


toms - Do 21.10.04 14:14

Sehr wahrscheinlich handelt es sich um einen TSpeedButton, welcher kein Handle besitzt.


Stübi - Do 21.10.04 14:23

Das heisst ich kann den nicht ansprechen, oder eben ferngesteuert drücken?


Stübi - Fr 22.10.04 07:32

Guten Morgen

Ich habe jetzt folgendes mal ausprobiert, was bis auf eine Kleinigkeit auch super funktioniert.

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
  
  x := 366;  // Integer
  y := 298;  // Integer
  SendMessage(HandlerWind,WM_SYSCOMMAND,SC_RESTORE,0);
  SetForegroundWindow(HandlerWind);
  PostMessage(HandlerWind,WM_MOVE,0,0);  //Funktioniert nicht, Fenster wird nicht verschoben
  Mouse.CursorPos:=Point(366,298);
  mouse_event(MOUSEEVENTF_leftDOWN,x,y,0,0);
  mouse_event(MOUSEEVENTF_leftUP,x,y,0,0);

Ich will das Fenster mit dem Button den ich drücken will an die Position oben links verschieben (0,0) und dann mit der Maus auf den Button clicken. Wenn ich das Fenster zuvor selbst an diese Position verschiebe funktioniert es, wenn sich das Fenster aber wo anders befindet wird es nicht verschoben und folglich ein Mausclick ins leere ausgeführt.

Soweit mein Problem.

Gruss Stübi


Stübi - Fr 22.10.04 07:48

:D Erfolge am Morgen in der Frühe :D

Hab noch etwas weiter gecoded und habe mein problem lösen können.
Ordne nun das Fenster über MoveWindow neu an und clicke dann an die richtige stelle, allen danke für ihre Antwort.

Gruss Stübi


F34r0fTh3D4rk - So 24.10.04 17:53

ich hab auch mal sowas geschrieben, das hat knöpfe in meiner eigenen anwendung
geklickt, war ziemlich sinnlos, aber egal.

Gibt es eine Möglichkeit, knöpfe(also Links) auf internetseiten zu klicken

zb bei google: suchen (oder so) ???


Stübi - So 24.10.04 18:22

Prinzipiell sicher, wenn sich die Links immer am genau gleichen Ort befinden kannst du einen Mausclick simulieren (an der entsprechenden Stelle) und zwar mit:

Delphi-Quelltext
1:
2:
  mouse_event(MOUSEEVENTF_leftDOWN,x,y,0,0);
  mouse_event(MOUSEEVENTF_leftUP,x,y,0,0);

x ist ein Integerwert der die Position auf der x-Achse angibt und y logischerweise dasselbe auf der y-Achse (in Pixel (soviel ich weiss))
Oder wenn die Tabreihenfolge immer gleich ist simulierst du die Anzahl Tabs und anschliessend ein Returnerreignis.

Gruss Stübi


GSE - So 24.10.04 18:57

Zitat:
Ordne nun das Fenster über MoveWindow neu an und clicke dann an die richtige stelle, allen danke für ihre Antwort.
wieso verschiebst du's erst, hol dir doch mit WindowRect die Koordinaten.

mfg
GSE


Stübi - So 24.10.04 19:02

Danke für den Tipp, wusste nicht dass es so einen Befehl gibt, ist natürlich einfacher.

Gruss Stübi


toms - So 24.10.04 19:42

Zitat:
Gibt es eine Möglichkeit, knöpfe(also Links) auf internetseiten zu klicken


Ja, Beispiele findest du genügend im WEB.