C# 2.0 응용 프로그램 외부에있는 창의 실행 파일 이름을 가져 오려고합니다. 내 응용 프로그램은 현재 "user32.dll"에서 GetForegroundWindow() 호출을 사용하여 창 핸들 (hWnd)을 가져옵니다.창 핸들 (hWnd) 만있는 경우 어떻게 GetModuleFileName()을 수행합니까?
내가 할 수 있었던 파기에서 PSAPI의 GetModuleFileNameEx() 함수를 사용하여 이름을 얻으려고했지만 GetModuleFileNameEx()는 윈도우가 아닌 프로세스의 핸들을 필요로한다고 생각합니다. .
창 핸들에서 프로세스 핸들을 가져올 수 있습니까? (먼저 윈도우의 스레드 핸들을 가져와야합니까?)
내가하려는 것을 명확히하기 위해 첫 번째 문장을 편집했습니다.
업데이트! 다음은 C# 코드입니다. 유일한주의 사항은 인 경우가 종종 있습니다 드라이브 문자가 "?"인 파일/경로를 반환합니다. 실제 드라이브 문자 (예 : "C") 대신. - 아직 이유를 알지 못 했어.
[DllImport("user32.dll")]
static extern uint GetWindowThreadProcessId(IntPtr hWnd, out uint lpdwProcessId);
[DllImport("kernel32.dll")]
static extern IntPtr OpenProcess(UInt32 dwDesiredAccess, Int32 bInheritHandle, UInt32 dwProcessId);
[DllImport("psapi.dll")]
static extern uint GetModuleFileNameEx(IntPtr hProcess, IntPtr hModule, [Out] StringBuilder lpBaseName, [In] [MarshalAs(UnmanagedType.U4)] int nSize);
[DllImport("kernel32.dll")]
[return: MarshalAs(UnmanagedType.Bool)]
static extern bool CloseHandle(IntPtr hObject);
private string GetWindowModuleFileName(IntPtr hWnd)
{
uint processId = 0;
const int nChars = 1024;
StringBuilder filename = new StringBuilder(nChars);
GetWindowThreadProcessId(hWnd, out processId);
IntPtr hProcess = OpenProcess(1040, 0, processId);
GetModuleFileNameEx(hProcess,IntPtr.Zero,filename,nChars);
CloseHandle(hProcess);
return (filename.ToString());
}
헤이 스택 오버 플로우를 환영
제조 - 나는 오랜 시간 독자 봤는데 너 –