OpenProcess Fehler - oder wie bekomme ich zu einem hWnd einen Pfad
-
Hallo,
ich möcht über ein Windows Handle herausbekommen wie der Pfad und der Name der ausgeführten Datei ist.
Dazu habe ich folgenden Code geschrieben:
[DllImport("user32.dll")] private static extern IntPtr GetWindowThreadProcessId(IntPtr hWnd, IntPtr ProcessId); [DllImport("User32", CharSet = CharSet.Auto)] private static extern IntPtr GetWindowLong(IntPtr hWnd, int Index); // [DllImport("kernel32.dll")] // public static extern IntPtr OpenProcess(UInt32 dwDesiredAccess, Int32 bInheritHandle, UInt32 dwProcessId); [DllImport("kernel32.dll")] public static extern IntPtr OpenProcess(UInt32 dwDesiredAccess, Int32 bInheiritHandle, UInt32 dwProcessId); [DllImport("psapi.dll")] static extern int GetModuleFileNameExt(IntPtr process, IntPtr module, [Out] StringBuilder fileName, int size); private static int GWL_HINSTANCE = -6; //private static UInt32 PROCESS_VM_READ = (0x0010); private static UInt32 PROCESS_VM_READ = 16; private static UInt32 PROCESS_QUERY_INFORMATION = (0x0400); public static void GetExeFromWindowHandle(IntPtr haWnd) { //################# Get the exe file which runs the window IntPtr dwProcessId = IntPtr.Zero; dwProcessId = GetWindowThreadProcessId(haWnd, (IntPtr)0); // int GetWindowLong(IntPtr hWnd, int Index); IntPtr hModule = GetWindowLong(haWnd, GWL_HINSTANCE); if (hModule == IntPtr.Zero) { return; } // IntPtr hProcess = OpenProcess(PROCESS_QUERY_INFORMATION, 1, (uint)dwProcessId); IntPtr hProcess = OpenProcess((uint)PROCESS_VM_READ | (uint)PROCESS_QUERY_INFORMATION, 1, (uint) dwProcessId); //HANDLE hProcess = OpenProcess(PROCESS_VM_READ | PROCESS_QUERY_INFORMATION, FALSE, dwProcessId); if (hProcess == IntPtr.Zero) return; StringBuilder ProcessExeFile = new StringBuilder(); GetModuleFileNameExt(hProcess, hModule, ProcessExeFile, 512); //CloseHandle(hProcess); //return bOk; }
Funktioniert alles bis zur Zeile:
IntPtr hProcess = OpenProcess((uint)PROCESS_VM_READ | (uint)PROCESS_QUERY_INFORMATION, 1, (uint) dwProcessId);
Wenn ich mir die ErrorMessage von Marshal.GetLastWin32Error() ausgeben lasse heißt es "Falscher Parameter.\r\n"
Die Methode
GetWindowModuleFileName
geht leider nicht, da sie auf WinXP nur die exe des aufrundenn Programm (meins) für jedes Programm zurückliefert.
Im Endeffekt such ich also nach einer Methode / Code die mir erlaubt ein FENSTER einem PROCESS zuzuordnen oder umgekehrt von einen PROCESS alle Fenster zu ermitteln. Und das beste wäre natürlich alles in C#.
Grüße,
Der Unbekannte
-
Autsch!!!
Ich hab den Fehler... Bin aber grad zu müde um ihn ausführlich zu schreiben. Erstmal nur der Link der mich drauf gebracht hat:
http://forums.microsoft.com/MSDN/ShowPos...694351&SiteID=1
Wie ich auf den Link gekommen bin, nachdem ich geschlafen hab.