Mousehook wenn Maus geklickt wurde, die Edit Felder von meinem Programm auslesen?
-
Hallo,
ich habe von der FAQ den Mousehook benutzt und möchte, wenn die Maus bei meinem anderen Programm geklickt wird, das dann die Editfelder ausgelesen wird.Der Mousehook wurde bei mir erfolgreich Installiert, nur wie kann ich bei meinem anderen Programm die Editfelder auslesen und diese bei meinem Mousehook ins Memo schreiben?
if(msg.WParam == WM_LBUTTONUP) //Hier werden dann die aktionen ausgeführt, wenn man die linke Maustaste klickt
Ich bedanke mich schonmal im Voraus.
MfG
-
SendMessage und WM_GETTEXT?
-
Danke, das habe ich ja gemacht, aber wenn ich Texte z.B. im Internet Explorer von einem Editfeld etwas auslesen möchte, dann bekomme ich immer den Wert 0 bei FindWindowEx:
HWND Fenster = FindWindow("IEFrame",NULL); HWND hwndEdit = FindWindowEx(Fenster, 0, "Edit", NULL); int nLen = SendMessage(hwndEdit, WM_GETTEXTLENGTH, 0, 0); char *pText = new char[nLen]; SendMessage(hwndEdit, WM_GETTEXT, (WPARAM)nLen, (LPARAM)pText); Memo1->Text = pText;
Woran könnte der fehler liegen?
MfG
-
Heißt das denn auch wirklich "Edit"? Überprüfe das am besten mit Spy++.
-
Danke Dir.
Ich bekomme Spy++ irgendwie nicht zum downloaden und habe mal WinID gedownloadet.
Hier die Daten:
ScreenDanke schonmal für die Hilfe.
Edit: Ich hab mal zum Test Knuddels.de genommen und wollte mal versuchen bei Nickname das feld auszulesen:
HWND wndMain = FindWindow("IEFrame","Chat - Knuddels.de - Windows Internet Explorer"); HWND wndChild = FindWindowEx(wndMain, 0, "TabWindowClass", NULL); wndChild = FindWindowEx(wndChild, 0, "Shell DocObject View", NULL); wndChild = FindWindowEx(wndChild, 0, "Internet Explorer_Server", NULL); wndChild = FindWindowEx(wndChild, 0, "Java Plug-in Control Window", NULL); wndChild = FindWindowEx(wndChild, 0, "SunAwtFrame", NULL); wndChild = FindWindowEx(wndChild, 0, "SunAwtCanvas", NULL); wndChild = FindWindowEx(wndChild, 0, "SunAwtCanvas", NULL); wndChild = FindWindowEx(wndChild, 0, "SunAwtCanvas", NULL); wndChild = FindWindowEx(wndChild, 0, "SunAwtCanvas", NULL); wndChild = FindWindowEx2(wndChild,"SunAwtCanvas", 2); wndChild = FindWindowEx(wndChild, 0, "SunAwtCanvas", NULL); wndChild = FindWindowEx2(wndChild,"SunAwtCanvas", 2); wndChild = FindWindowEx(wndChild, 0, "Edit", NULL); int nLen = SendMessage(wndChild, WM_GETTEXTLENGTH, 0, 0); char *pText = new char[nLen]; SendMessage(wndChild, WM_GETTEXT, (WPARAM)nLen+1, (LPARAM)pText); Memo1->Text = pText;
Hab jetzt ein Problem mit FindWindowEx2, habe diese Funktion von Delphi, nur habe ich ein kleines Problem diesen Code in C++ umzuschreiben:
function FindWindowEx2(hParent: HWND; ChildClassName: string; ChildNr: Word): HWND; var i: Word; hChild: HWND; begin hChild := 0; Result := 0; Dec(ChildNr); for i := 0 to ChildNr do begin hChild := FindWindowEx(hParent, hChild, PChar(ChildClassName), nil); if hChild = 0 then Break; Result := hChild; end; end;
Ich weiss, das hier ist kein Delphi Forum, aber ich weiss nicht, wie ich sonst mein Problem beheben kann, desswegen sry.
Ich wäre euch sehr danbkbar, wenn einer den Code in C++ umschreiben kann.
Edit: Ich habs jetzt selbst geschaft, diesen Code in C++ umzuschreiben, jetzt ist da nur noch ein kleiner Fehler:
HWND TForm1::FindWindowEx2(HWND hParent, String ChildClassName, Word ChildNr) { Word i; HWND hChild; hChild = 0; ChildNr = ChildNr - 1; for (i=0; i<ChildNr; i++) { hChild = FindWindowEx(hParent, hChild, PChar(ChildClassName), NULL); if (hChild == 0) { break; } return hChild; } }
[C++ Fehler] Unit1.cpp(116): E2031 Typumwandlung von 'AnsiString' nach 'char *' nicht zulässig [C++ Warnung] Unit1.cpp(123): W8070 Funktion sollte einen Wert zurückgeben
Da ist der Fehler: PChar(ChildClassName), wie kann ich diesen Fehler beheben?
Vielen Dank schonmal im Voraus.
MfG
-
Weiss denn keiner, wie ich den Code in C++ umschreiben kann?
Hier der Delphi-Code:
function FindWindowEx2(hParent: HWND; ChildClassName: string; ChildNr: Word): HWND; var i: Word; hChild: HWND; begin hChild := 0; Result := 0; Dec(ChildNr); for i := 0 to ChildNr do begin hChild := FindWindowEx(hParent, hChild, PChar(ChildClassName), nil); if hChild = 0 then Break; Result := hChild; end; end;
und so habe ich es versucht in C++ umzuschreiben:
HWND FindWindowEx2(HWND hParent, String ChildClassName, WORD ChildNr) { WORD i; HWND hChild; hChild = 0; ChildNr--; for (i=0; i<ChildNr; i++) { hChild = FindWindowEx(hParent, hChild, ChildClassName.c_str(), NULL); if (hChild == 0) { break; } return hChild; } }
Der Code lässt sich zwar fertig Kompilieren, aber das Textfeld kann immer noch nicht gefunden werden.
Ich muss nur den Delphi-Code richtig für C++ umschreiben, dann sollte es eigentlich gehen.Kann mir vieleicht einer sagen, wo der fehler im Code ist?
MfG
-
Hallo
Der C++ Code entspricht dem Delphi-Code soweit ich das überblicken kann. Wenn du also kein Ergebnis bekommst liegt das nicht am Code selber, sondern a nseiner Verwendung. Vielleicht solltest du das lieber im WinAPI-Forum weiterführen, denn mit dem Builder hat das dann nichts mehr zu tun.
bis bald
akari
-
Vielen Dank für die antwort.
Eigentlich sollte das ja auch ohne FindWindowEx2 gehen, wenn ich mich nicht irre.
Naja, ich habe mal einen Thread in WinApi Forum aufgemacht, aber trotzdem, Danke.
MfG