An ToolBar-Buttons eines anderen Prozesses herankommen
-
Hi!
Ich möchte gerne mit meinem Programm den "Trennen"-Toolbutton von eMule drücken können. Da ergibt sich aber das Problem, an den Button heranzukommen. Ich brauche seine Command-ID, welche ich per TB_GETBUTTON nicht bekomme. Per Google habe ich herausgefunden, dass ich entweder GlobalAlloc() oder VirtualAllocEx() benutzen muss, um in den Address-Space des anderen Prozesses zu gelangen. Mit GlobalAlloc() klappt es bei mir jedoch genauso wenig, wie wenn ich alles auf dem Stack meiner Anwendung erstelle. Kann natürlich daran liegen, dass ich diese Funktion nur rudimentär verstehe. Hab sie bisher nur mit GMEM_FIXED benutzt. VirtualAllocEx() verstehe ich noch weniger. Deshalb ist mit bei einem Versuch auch sofort der eMule abgestürzt. Könnte mich jemand auf den richtigen Weg führen?P.S.: Nur zur Info und der Fairness halber: Ich habe meine Frage auch in www.winapi.net gepostet.
-
ich denke du wirst gar nicht darauf zurückgreifen können den afaik ist die gui mit gtk(+) entwickelt worden, oder war das nur unter linux
-
Hmmm? Ist doch völlig wurscht. gtk+ kapselt doch unter Windows auch nur die WinAPI...
-
Kannst du die ID nicht im eMule Quellcode suchen? Oder ist die jedes mal anders?
eMule wurde mit MFC programmiert.
-
Gute Idee! Nur weiß ich erstens nicht, ob ich dann per TB_PRESSBUTTON den Button auch drücken kann, und zweitens kann sich dieser Wert ja auch mal ändern. Eher invariant bleibt mit Sicherheit die Position des Buttons (ganz links). Diese Möglichkeit behalte ich aber im Kopf. Ich betrachte sie als letzten Ausweg.
-
Ich glaube das mit einer festcodierten ID wäre sogar zuverlässiger.
Hab nämlich gerade gesehen das man die Toolbar nach seinen Wünschen anpassen kann und somit auch den Button an eine andere Position bringen kann.
-
Wie das? Hab bei mir keine Möglichkeit dazu gefunden.
Am sichersten wäre es aber eh, wenn man alle Buttons durchgeht, und schaut, welcher die Aufschrift "Trennen" hat. Ich möchte das gerne so machen. Also bräuchte ich jetzt jemanden, der mir die Funktion VirtualAllocEx() erklärt...
-
Ok, da kann ich dir nicht helfen.
___
Die Toolbars kann man anpassen indem man einen Rechtsklick auf die Toolbar macht und dann "Toolbar anpassen" wählt.Und die Suche nach dem Button mit der Aufschrift "Trennen" klappt dann ja auch wieder nur in der deutschen Version.

___
MitSendMessage(eMuleMainWindow, WM_COMMAND, 16129, 0);klappts bei mir.
-
Mein Programm ist auch auf deutsch. Also nun... Ist da jemand, der sich mit MemoryManagement zwischen Prozessen auskennt?
-
guck mal hier: http://www.codeproject.com/shell/ctrayiconposition.asp
-
Das war nicht für mich bestimmt, oder?
-
D-O-C-H

-
OK. Verstehe ich aber nicht. In winapi.net habe ich jetzt Hilfe von -King- bekommen. So sieht's fertig aus:
DWORD pID; TBBUTTON tbb; HANDLE hProcess; int button_count; CHAR txt[1024]; // Fenster holen HWND hEmule = FindWindow(NULL, "eMule v0.45b"); HWND hRB = FindWindowEx(hEmule, NULL, "ReBarWindow32", NULL); HWND hTB = FindWindowEx(hRB, NULL, "ToolbarWindow32", NULL); // Das Prozess-Handle holen GetWindowThreadProcessId(hEmule, &pID); hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, pID); // Die Anzahl aller TBButtons holen und Memory im Emule-Prozess reservieren button_count = SendMessage(hTB, TB_BUTTONCOUNT, 0, 0); LPTBBUTTON ptbb = (LPTBBUTTON)VirtualAllocEx(hProcess, NULL, sizeof(TBBUTTON), MEM_COMMIT, PAGE_READWRITE); LPSTR ptxt = (LPSTR)VirtualAllocEx(hProcess, NULL, 1024, MEM_COMMIT, PAGE_READWRITE); // Die Daten aus den Buttons auslesen und wenn nötig, Button drücken for(int i=0; i < button_count; ++i) { SendMessage(hTB, TB_GETBUTTON, (WPARAM)i, (LPARAM)ptbb); ReadProcessMemory(hProcess, (LPCVOID)ptbb, (LPVOID)&tbb, sizeof(TBBUTTON), NULL); SendMessage(hTB, TB_GETBUTTONTEXT, (WPARAM)tbb.idCommand, (LPARAM)ptxt); ReadProcessMemory(hProcess, (LPCVOID)ptxt, (LPVOID)txt, 1024, NULL); if( lstrcmpi("T&rennen", txt) == 0 ) if( (tbb.fsStyle & TBSTYLE_SEP) == 0 ) SendMessage(hEmule, WM_COMMAND, MAKEWPARAM(tbb.idCommand, 0), (LPARAM)NULL); } // Speicher wieder freigeben VirtualFreeEx(hProcess, ptxt, 0, MEM_RELEASE); VirtualFreeEx(hProcess, ptbb, 0, MEM_RELEASE); // Das Prozess-Handle wieder freigeben CloseHandle(hProcess);