Pfad irgendeines offnen Fensters ermitteln!
-
Hallo,
ich bin gerade dabei zu versuchen den Pfad eines Fensters zu ermitteln welches gerade offen ist z.B. Handle einlesen mit GetWindowForeground() und dann soll es mit GetWindowModuleFileName() weiter gehen oder andere Funktionen. Mein code sieht so erstmal speziell auf ::FindWindow(0, L"Rechner"); ausstring test; HWND hwnd = ::FindWindow(0, L"Rechner"); WCHAR szFilename[MAX_PATH]; UINT zahl = ::GetWindowModuleFileName(hwnd, szFilename, MAX_PATH); for(int i = 0; i < MAX_PATH; i++) { test += szFilename[i]; cout << test; } cout << zahl << endl; MessageBox(NULL, szFilename, L"test", MB_OK);
calc.exe ist offen, UINT zahl, der Rückgabewert also ist 0 egal ob calc.exe offen ist oder nicht. Und der String test gibt in der Console nur diese zeichen hier aus:
╠╠╠╠╠╠╠╠╠╠
╠╠╠╠╠╠╠╠╠╠
╠╠╠╠╠╠╠╠╠╠
╠╠╠╠╠╠╠╠╠╠Hinzukommt dassich eine Warnung bekomme:
Konvertierung von TCHAR in char möglicher Datenverlust. Nun frage ich mich ob es vlt daran liegt? Mir fällt aber keine andere Konvertierungsmöglichkeit ein.
Ach un bei Messagebox kommen genauso leere kleine vierecke.So un nu hab ich das ganze ma mit GetForegroundWindow() gemacht. Das Ergebnis war leider das gleiche -. -
Ich hoffe ihr könnt mir helfen und ich hoffe dass ihr vlt auch andere Lösungen habt wie ich von einem Fenster was sich gerade im Vordergrund befindet, also in dem ich gerade arbeite, den Vollständigen Pfad bekomme UND wie ich eine gute Konvertierung hinbekomme so dass ich den Buffer auch auslesen kann mit dem Kram den ich auch lesen kann^^.
MfG Angelus2008
-
is hwnd überhaupt gültig?
-
Ja wenn calc zu is is der FindWindow handle 00000000 un wenn es offen ist, ist es ein anderer Wert der sich beim schließen un öffnen der calc.exe stätig ändert! Bei GetForegroundWindow ändert sich der handle immer wenn ich mein Programm aufrufe.
-
ok ich checks gerad mal für dich, mom
-
sorry werbung ist zu ende, mach ich nachher
-
Danke dir schonmal.
MfG Angelus2008
-
ich habe deinen code mal kurz probiert und ich habe die vermutung daß GetWindowModuleFileName nur mit fenstern funktioniert, die zum gleichen prozess gehören. probier das mal aus ob es dann funzt.
-
in der msdn steht zwar nix davon, aber das wär mal meine spontane vermutung
-
Also mit GetThreadProcessID arbeiten oder?
-
ja GetWindowThreadProcessId und GetModuleFileNameEx
-
Bist Du sicher, daß Du mit UNICODE kompilierst? Deine Fehlerbeschreibungen deuten darauf hin, daß das nicht der Fall ist. Im Code benutzt Du aber WideCharakters.
-
asdca schrieb:
in der msdn steht zwar nix davon, aber das wär mal meine spontane vermutung
Steht in der Knowledge Base:
GetWindowModuleFileName and GetModuleFileName correctly retrieve information about windows and modules in the calling process. In Windows 95 and 98, they return information about windows and modules in other processes. However, in Windows NT 4.0 and Windows 2000, since module handles are no longer shared by all processes as they were on Windows 95 and 98, these APIs do not return information about windows and modules in other processes.
-
Ich hab da was gelesen von wegen UNICODE aber ich dachte das braucht man nur unter 95/98. ich benutze MS Visual Studio 9.0 un mein Code sieht nun so aus:
string test; DWORD aufnehmen = 0, aufnehmen2 = 0; LPDWORD pid = 0; TCHAR name[MAX_PATH]; HWND hwnd = ::FindWindow(0, L"Rechner"); aufnehmen = GetWindowThreadProcessId(hwnd, pid); aufnehmen2 = GetModuleFileNameEx(hwnd, NULL, name, MAX_PATH); for(int i = 0; i < MAX_PATH; i++) { test += name[i]; } cout << "Name: " << test << endl; cout << "FindWindow hwnd: " << hwnd << " : GWTProcessID DWORD: " << aufnehmen << " : GMFileNameEx DWORD: " << aufnehmen2 << endl;
Die Warnung über möglichen Datenverlust von WCHAR/TCHAR in char ist immernoch gegeben. Die Ausgabe sieht so aus wenn die calc.exe offen ist:
Name: ╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠
╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠
╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠
╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠
FindWindow hwnd: 007D043A : GWTProcessID DWORD: 3956 : GMFileNameEx DWORD: 0Wobei sich der handle natürlich ändert un der Prozess DWORD wert auch.
-
Schaut euch bitte erstmal noch das andere Problem an, denn hier habe ich wieder was neues ^^. Ich habe in den Eigenschaften meines Programmes den Zeichensatz (UNICODE war voreingestellt) von UNICODE auf Multi-Byte gesetzt somit musste ich ein paar Änderungen an meinem Code vornehmen:
string test; DWORD aufnehmen = 0, aufnehmen2 = 0; LPDWORD pid = 0; char name[MAX_PATH]; HWND hwnd = ::FindWindow(0, "Rechner"); aufnehmen = GetWindowThreadProcessId(hwnd, pid); aufnehmen2 = GetModuleFileNameExA(hwnd, NULL, name, MAX_PATH); for(int i = 0; i < MAX_PATH; i++) { test += name[i]; } cout << "Name: " << test << endl; cout << "FindWindow hwnd: " << hwnd << " : GWTProcessID DWORD: " << aufnehmen << " : GMFileNameEx DWORD: " << aufnehmen2 << endl;
Wie ihr sehen könnt sind die L´s weg vor den strings und TCHAR ist nun char und die Warnung mit dem Datenverlust von TCHAR in char ist nun auch weg, also kann es daran nun nicht mehr liegen, es besteht dennoch das gleiche Problem mit der Ausgabe.
-
ich hab doch schon gesagt was das prob ist.
-
achso hast du schon ok
-
deine parameter sind auch völlig falsch, GetModuleFileNameEx erwartet n process handle kein fenster handle
-
hier frickels dir zurecht, mein psdk ist von 1998.
#include "windows.h" typedef LPVOID (WINAPI *LPFUNC)(); LPFUNC PSAPICall( LPCSTR lpFunc ) { return (LPFUNC)GetProcAddress(LoadLibrary(L"PSAPI.DLL"), lpFunc); } int main(int argc, char* argv[]) { DWORD pid = 0; WCHAR name[MAX_PATH]; HANDLE h; HWND hwnd = FindWindow(0, L"Calculator"); GetWindowThreadProcessId(hwnd, &pid); h = OpenProcess(PROCESS_ALL_ACCESS, FALSE, pid); PSAPICall("GetModuleFileNameExW")(h, NULL, name, MAX_PATH); MessageBox(NULL, name, L"", 0); }
-
Hab mein code nun ma ein wenig bearbeitet aber sry ich werd hier noch bekloppt -. - selbst wenn ich deines ausführe (natürlich vorher Veränderungen vorgenommen) Bekomme ich nur Zeichenschrott auf meiner MessageBox ausgespuckt! Und mein Code sieht nun so aus:
#include <iostream> #include <windows.h> #include <process.h> #include <string> #include <psapi.h> #pragma comment(lib, "psapi.lib") using namespace std; int main() { string test = ""; DWORD aufnehmen = NULL, aufnehmen2 = NULL, pid = NULL; char name[MAX_PATH]; HANDLE handle = NULL; HWND hwnd = NULL; hwnd = FindWindowA(0, "Rechner"); aufnehmen = GetWindowThreadProcessId(hwnd, &pid); handle = OpenProcess(PROCESS_ALL_ACCESS, FALSE, pid); aufnehmen2 = GetModuleFileNameExA(handle, NULL, name, MAX_PATH); cout << "Aufhanme von FindWindow...: " << hwnd << " : Aufnahmewert von GetWindowThread...: " << aufnehmen << " : Handle von OpenProcess...:" << handle << " : Aufnahme von GetModuleFile...:" << aufnehmen2 << "\n\n"; for(int i = 0; i < MAX_PATH; i++) { test += name[i]; } cout << "Name: " << test << endl << "FindWindow hwnd: " << hwnd << " : Process: " << aufnehmen << " : Module DWORD: " << aufnehmen2 << endl; }
Zeichensatz Multi-Byte, keine Warnungen un das Ergebnis sieht so aus wenn calc.exe offen ist:
Aufhanme von FindWindow...: 0059026C : Aufnahmewert von GetWindowThread...: 4780
: Handle von OpenProcess...:00000000 : Aufnahme von GetModuleFile...:0Name: ╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠
╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠
╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠
╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠
FindWindow hwnd: 0059026C : Process: 4780 : Module DWORD: 0Wat mach ich nur Falsch? Mir gehts eigentlich nur noch um die Anzeige des Pfades oder sehe ich da was falsch? Und im Endeffekt geht es mir net nur um die calc.exe es geht mir auch um den Pfad eines offenen Fenster mit GetForegroundWindow(). Nur wenn hier schon Fehler sind dann sind sie dort auch. Was ich im Übrigen schon getestet hatte!
-
Angelus2008 schrieb:
GetModuleFile...:0
wenn GetModuleFileNameEx 0 zurückgibt, ist sie fehlgeschlagen.
Also muss es daran liegen. Kannst ja mal GetLastError() aufrufen