An ToolBar-Buttons eines anderen Prozesses herankommen
-
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);