Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   SendMessage - Button Click (https://www.delphipraxis.net/158188-sendmessage-button-click.html)

-187- 8. Feb 2011 23:11

SendMessage - Button Click
 
Moin, ich versuche einen Mausklick auf eine Webbrowser Komponente zu erzeugen sodass ich ein Object auf der Website anklicken könnte, jedoch klappt das nicht. Wenn ich das selbe mit nem Memo versuche dann klappt es. Wieso klappt das nicht mit dem WebBrowser ?

Bitte fragt nicht warum und wieso ich sowas versuche :) Es ist nur spielerei und ich wunder mich warum das nicht klappt..

Code:
var
  Pt: TPoint;
begin
  Pt.X:=200;
  Pt.Y:=300;
  Pt:=ClientToScreen(Pt);
  SendMessage(WebBrowser1.Handle,WM_RBUTTONDOWN,Pt.X,Pt.Y);
  SendMessage(WebBrowser1.Handle,WM_RBUTTONUP,Pt.X,Pt.Y);

-187- 9. Feb 2011 08:11

AW: SendMessage - Button Click
 
Hmm verdammt, mit jeder anderen Komponente gehts :) (Button, Memo, Panel etc..)

Hat vielleicht jemand einen anderen Ansatz um einen Klick auf den Webbrowser zu simulieren. Das Problem ist das ich einen Button auf einer Website kicken möchte. (Ich weiss das es andere sinnvollere Möglichkeiten gibt jedoch muss es doch möglich sein diesen simplen Klick zu simulieren :)

Mit folgenden Code klappt das auch aber nur im aktiven Fenster... Wenn ich jetzt den Klick auf eine nicht sichtbare Komponente simulieren will kann ich ja nur übers Handle gehen..


Code:
  Point.X:=Panel1.Left+(Panel1.Width div 2);
  Point.Y:=Panel1.Top+(Panel1.Height div 2);
  Point:=ClientToScreen(Point);
  SetCursorPos(Point.X,Point.Y);
  //Perform Left Click
  mouse_event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0);
  mouse_event(MOUSEEVENTF_LEFTUP, 0, 0, 0, 0);

DeddyH 9. Feb 2011 08:20

AW: SendMessage - Button Click
 
Hier im Forum suchenTWebbrowser Click

himitsu 9. Feb 2011 10:18

AW: SendMessage - Button Click
 
Zitat:

Delphi-Quellcode:
Pt:=ClientToScreen(Pt);

WM_RBUTTONDOWN erwartet eine relative Position und keine Absolute.

Das es mit dem Memo klappte war dann wohl eher nur Zufall ... also wenn du es da auch mit den Absoluten Werten versucht hattest.

-187- 9. Feb 2011 14:37

AW: SendMessage - Button Click
 
Hmm was meinst du mit relativen Angaben ? Meinst du das die Abstände vom Form Rand gemessen werden sollten ?

DeddyH 9. Feb 2011 14:38

AW: SendMessage - Button Click
 
Genau das war gemeint.

himitsu 9. Feb 2011 15:22

AW: SendMessage - Button Click
 
Fast ... die Abstände gemessen von der oberen-linken Ecke des Controls, an welches man diese Message schickt.

mouse_event sendet es an das "aktive" Control, in Desktopkoordinaten.

ClientToScreen rechnet die Koordinaten auf die Desktopkoordinaten um, in Bezug auf Top/Left derKomponente, in welcher die Funktion aufgerufen wird (Self.ClientToScreen = die Form).

WebBrowser1.ScreenToClient rechnet Desktopkoordinaten in relativer Koordinaten für WebBrowser1 um.

-187- 9. Feb 2011 19:09

AW: SendMessage - Button Click
 
Code:
var
  Pt: TPoint;
begin
  Pt.X:=200;
  Pt.Y:=300;
  Pt:=ClientToScreen(Pt);
  PostMessage(WebBrowser1.Handle,WM_LBUTTONDOWN,Pt.X,Pt.Y);
  PostMessage(WebBrowser1.Handle,WM_LBUTTONUP,Pt.X,Pt.Y);
  SetCursorPos(Pt.X,Pt.Y);
end;
Ich habe mir mit Zeile 9 jeweils anzeigen lassen wo mein klick ausgeführt wird. Wenn du mir jetzt sagst das WM_LBUTTONDOWN relative Koordinaten verwendet und SetCursorPos absolute Koordinaten verwendet dann wäre einiges klar. Ich wüsste aber sonst nicht wie man den klick genau ausloten kann :/

himitsu 9. Feb 2011 19:17

AW: SendMessage - Button Click
 
TWebBrowser bietet auch die Möglichkeit, quasi wie im JavaScript, über dessen DOM auf den Button zuzugreifen und .click direkt auszuführen.
Wie das jetzt genau geht, weiß ich grad nicht mehr, aber wenn man mal sucht, wie man z.B. eine Seite direkt in den TWebBrowser läd, oder wie man darüber auf (HTML)Inhalte von Edits/DIVs zugreift, dann sollte der Rest einfach zu lösen sein.

-187- 9. Feb 2011 19:56

AW: SendMessage - Button Click
 
Code:
Ich habe mir mit Zeile 9 jeweils anzeigen lassen wo mein klick ausgeführt wird. Wenn du mir jetzt sagst das WM_LBUTTONDOWN relative Koordinaten verwendet und SetCursorPos absolute Koordinaten verwendet dann wäre einiges klar. Ich wüsste aber sonst nicht wie man den klick genau ausloten kann :/

..Ist das denn jetzt so ? Und hättest du einen Tipp wie man das ausloten kann ?

himitsu 9. Feb 2011 20:25

AW: SendMessage - Button Click
 
Nimm mal eine TPanel (oder was auch immer) und leg dir ein OnMouseDown-Eereignis zu Diesem an.
Darin dann alle empfangen Werte z.B. in einem Label oder Memo anzeigen.
Delphi-Quellcode:
Label1.Caption := Format('%d: X=%d, Y=%d', [GetTickCount, X, Y]);
.

Nun sendest du die gewünschten Klick-Ereignisse einfach mal an dieses Panel und schon siehst du wo etwas landet.


Ein Problem könnte jetzt noch sein, daß SendMessage den Klick an den Broswer (also das Fenster) sendet, und z.B. ein darin enthaltener Button garnicht darauf reagiert, weil er sich ja nicht angesprochen fühlt, wselbst wenn die Koordinaten ihn treffen würden.

PS: zu solchen Theman gibt es eigentlich auch schon ein paar dutzend Threads, alleine in der DP

-187- 9. Feb 2011 20:39

AW: SendMessage - Button Click
 
Hmm also ich versuche einen Javascript Button zu treffen. Vielleicht gibt es ja eine besser Lösung... Hier der Code:

Code:
<button onClick="getMovie().buttonClick('Find_k');" disabled="true" id="Find_k">Waiting</button>

rollstuhlfahrer 9. Feb 2011 21:33

AW: SendMessage - Button Click
 
Der Button hat also netterweise eine ID. Damit kannst du ihn über WebBrowser1.document.getElementByID() aufspüren. Danach kannst du diesem Button sagen, dass er sich gedrückt fühlen soll ( .click() ) und dann passiert auch genau das, was du willst.

Bernhard

ADD: Winziges Beispiel gefällig? - Button 1 drückt auf Button 2:
HTML-Code:
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"><html><head><title></title><script>
function test() {
  document.getElementById("testbutton").click();
}

function test2() {
  alert("Hey, you clicked me!");
}

</script>
</head><body>

<button type="button" onclick="test();">Click Me!</button>
<button type="button" onclick="test2();" id="testbutton">Click Me! - 2</button>

</body></html>

-187- 9. Feb 2011 21:58

AW: SendMessage - Button Click
 
Super ! Mit deinen Tipps bin ich jetzt schon recht weit gekommen. Wusste garnicht das es so einfach sein kann :) MERCI !

Jedoch steh ich vor einem letzten Problem: Auf der Textarea liegt auch ein Javasript "onKeyDown" Event. Das müsste ich irgendwie über Delphi aufrufen..

Code:
onKeyDown="Submit(event);"
Hintergrund: Um den Inhalt abzuschicken gibt es hier kein Submit Button sondern halt nur diese Event. Ich glaube In Chatrooms funktioniert das ähnlich^^


Edit: Ok hab's gelöst. Bin in einem anderen Forum auf eine "Execute JavaScript" Funktion gestoßen. Klappt Prima! ;)

rollstuhlfahrer 10. Feb 2011 18:07

AW: SendMessage - Button Click
 
Um dann noch allen anderen zu ermöglichen, dem Link zu diesem Thread zu folgen, wäre es sehr nett, wenn du diesen dann auch noch posten würdest.

Bernhard


Alle Zeitangaben in WEZ +1. Es ist jetzt 08:45 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz