2011-03-31 95 views
1

爲了得到前臺窗口(或應用程序文件的名稱)的應用程序名稱,我想使用GetActiveWindowGetWindowModuleFileName替代GetWindowModuleFileName獲取其他進程ApplicationFileName?

我發現有關GetWindowText時here

GetWindowText時的那執行工作正常,但只GetWindowModuleFileName爲Visual Studio(當我點擊devenv的內部)返回一個值,它保持空白的所有其他應用程序類似的問題。

任何提示我怎麼能找出哪裏出了問題?可能這與我的應用程序的權限/安全性有關,查詢另一個進程的應用程序文件名?

編輯:http://support.microsoft.com/?id=228469看起來像這樣在Win> = XP

任何替代方案如何獲取應用程序的文件名不起作用?

+1

http://support.microsoft.com/?id=228469還建議使用GetModuleFileNameEx代替;使用GetActiveWindow + GetWindowThreadProcessId + OpenProcess + GetModuleFileNameEx。 (請注意,如果您嘗試打開具有較高權限級別或以不同用戶身份運行的進程,則OpenProcess將失敗;例如,以普通用戶身份運行的此代碼無法打開以Process身份運行的進程。) – BrendanMcK 2011-04-01 00:15:11

+0

@Brendan如果您指定一個小的請求權限集,您是否可以打開一個更高權限的進程?我猜想,GetModuleFilenameEx失敗,但具有這樣的權限集。 – CodesInChaos 2011-04-01 10:42:21

回答

1

爲了獲得前臺窗口(或應用程序的文件名),我想用GetActiveWindow與GetWindowModuleFileName的應用程序名稱。

...查詢另一個進程的applicationfilename ...

在我看來與使用GetActiveWindow()函數的您的問題。它僅用於從調用線程/進程收集信息。如果調用線程處於非活動狀態GetActiveWindow返回0;

從MSDN:

GetActiveWindow檢索窗口句柄連接到調用線程的消息隊列的活動窗口。

嘗試使用GetForegroundWindow()函數代替GetActiveWindow()

+0

謝謝我發現GetForegroundWindow()也是我需要的,請參見下文。 – Cilvic 2011-04-01 12:53:48

0

偶然你有UAC關閉?

從Vista開始,如果您的代碼在另一個進程中觸及HWND,那麼您的進程需要在相同的特權級別運行。

換句話說,如果窗口託管在以管理員身份運行的進程中,則您的應用程序還必須以管理員身份運行。

0

我發現使用此解決方法:

[DllImport("user32.dll", SetLastError = true)] 
static extern uint GetWindowThreadProcessId(IntPtr hWnd, out uint lpdwProcessId); 

IntPtr handle = IntPtr.Zero; 
handle = GetForegroundWindow(); 

uint processId; 
if (GetWindowThreadProcessId(handle, out processId) > 0) 
{ 
    Console.WriteLine(Process.GetProcessById((int)processId).MainModule.FileName); 
} 
+0

當嘗試從32位進程獲取64位進程的信息時(或反之亦然),此方法不起作用 – Geoffrey 2013-11-27 08:26:21