Entwickler-Ecke

Windows API - Sendmessage -> fenster wird weiss


Ebil - Sa 29.11.08 01:04
Titel: Sendmessage -> fenster wird weiss
Hi Leute,
Ich habe ein problem, ich will ein mausklick an ein fenster simulieren und mache das einfahc mit:
SendMessage(handle, MOUSEEVENTF_LEFTDOWN, 0, 0);
(PostMessage auch schon probiert).

Leider wird (egal bei welchem fenster ich das mache) Das Fenster einfach weiss! Wenns in einem ordner ist, muss ich den explorer beenden und neu starten...
Woran liegt das? Mehr code als das ist noch garnicht vorhanden...

Ebil


Moderiert von user profile iconNarses: Topic aus Delphi Language (Object-Pascal) / CLX verschoben am So 30.11.2008 um 19:47


jaenicke - Sa 29.11.08 01:48

Naja, du drückst du Maustaste nur nach unten, und danach wartet das Programm bis du sie wieder loslässt. Das passiert bei dir aber ja nicht, wenn du nur diese Zeile hast.

Ein paar Beispiele siehst du hier (ist zwar C++, aber das ist ja egal):
http://www.c-plusplus.de/forum/viewtopic-var-t-is-165868.html


Ebil - Sa 29.11.08 01:52

Naja habs übersehen, hab doch die 2 zeilen ;P.
Hab schon einiges gelesen, das fenster wird jetzt, warum auch immer nichtmehr weiss (vllt hatte mein PC probs ka), aber es funktioniert trozdem nichts.


Delphi-Quelltext
1:
2:
3:
  GetCursorPos(p);
  SendMessage(h, WM_LBUTTONDOWN,p.X ,p.Y);
  SendMessage(h, WM_LBUTTONUP,p.X, p.Y);


Fenster wird auch gefunden (habs sogar im programmfenster ausprobiert, geht nicht).

Ebil


jaenicke - Sa 29.11.08 01:54

Das kann auch nicht gehen, schau dir mal die Doku an, du versuchst x- und y-Koordinate als die beiden Parameter zu übergeben, das ist aber falsch.
http://msdn.microsoft.com/en-us/library/ms645607(VS.85).aspx


Ebil - Sa 29.11.08 02:02

Ich hab mir das schon nen paar mal durchgelesen, hab sowas in der richtung aber noch nie gemacht und komm damit nicht wirklich klar.

Delphi-Quelltext
1:
2:
3:
 
sendMessage(hand, WM_LButtonDown, 0, MakeLParam(p.X, p.Y));
SendMessage(hand, WM_LButtonUp, 0, MakeLParam(p.X, p.Y));


Das geht ja leider auch nicht :/

Hatte auch schon


Delphi-Quelltext
1:
2:
3:
 
sendMessage(hand, WM_LButtonDown, MK_LBUTTON, MakeLParam(p.X, p.Y));
SendMessage(hand, WM_LButtonUp, MK_LBUTTON, MakeLParam(p.X, p.Y));


Langsam weiss ich nicht mehr~

Ebil


jaenicke - Sa 29.11.08 02:11

Hast du dir denn mal den ersten Link angeschaut? Dort steht auch, dass man SendMessage eher nicht verwenden sollte. Und dort findest du ja auch komplette Beispiele, die praktisch 1:1 in Delphi umsetzbar sind.


Ebil - Sa 29.11.08 02:27

Da krieg ich leider direkt nen fehler beim ausführen:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
  klick.Itype := INPUT_MOUSE;
  klick.mi.dx := p.X;
  klick.mi.dy := p.Y;
  klick.mi.mouseData := 0;
  klick.mi.time := 0;
  klick.mi.dwExtraInfo := 0;
  klick.mi.dwFlags := MOUSEEVENTF_LEFTDOWN;
  SendInput(1, klick^, sizeof(klick^));
  klick.mi.dwFlags := MOUSEEVENTF_LEFTUP;
  SendInput(1, klick^, sizeof(klick^));


(Hab auch noch nie was mit "^" dingern gemacht, weiss nichma warums dahin muss, habs nur mal iwo gesehn...)
Bei den werten wo 0 steht bin ich mir nicht sicher, in c++ stand dort 0L, keine ahnung was da also genau hinmuss.
Die fehlermeldung:
Erste Gelegenheit für Exception bei $7C812A7B. Exception-Klasse EAccessViolation mit Meldung 'Zugriffsverletzung bei Adresse 00468E9E in Modul 'Project1.exe'. Schreiben von Adresse 00000000'. Prozess Project1.exe (5148)

Muss ich die variable (vom typ PInput) irgendwie inizialisieren?

Ebil

//Edit:
Ok muss wohl vom typ TInput sein, und dann können auch die ^ weg.
allerdings funktioniert das mit den koordinaten nicht ganz, die maus springt auf 0|0.

Ebil


jaenicke - Sa 29.11.08 02:31

Ich muss mal nachschauen, aber eigentlich hätte ich den Typ TInput statt des Zeigertyps PInput erwartet. PInput ist nur ein Zeiger auf eine Variable vom Typ TInput.
Und ohne die ^, weil es ja dann kein Zeiger ist.


Ebil - Sa 29.11.08 02:33

Joa wie im edit geschrieben hab ichs gemerkt.
hab nur pInput genommen weil in der funktion "pInputs" stand...

Das mit den maus bewegen geht nun auch, hatte noch MOUSEEVENTF_MOVE bei den dwFlags.

Danke für deine hilfe :), nun geht alles, für den anfang jedenfalls ^^.

Ebil