2014-02-25 58 views
0

我想獲取當前活動窗口的可執行文件的路徑。如何獲取當前活動應用程序窗口的路徑?

我想:

var 
    WindowModuleFileName : array[0..100] of Char; 
    sourceWindow: Hwnd;  
begin 
    sourceWindow := GetActiveWindow; 
    GetWindowModuleFileName(sourceWindow, PChar(WindowModuleFileName), sizeof(WindowModuleFileName));  
    ShowMessage(WindowModuleFileName);  
end; 

但它返回正確的答案,只有當我的應用程序窗口都是無效的。 我在做什麼錯?

回答

4

不能使用GetWindowModuleFileName來定位文件不是您自己的過程,在GetModuleFileName MSDN如說:

獲取完全合格的路徑包含指定的模塊文件。該模塊必須已由當前進程加載。

要找到由另一個進程加載的模塊的文件, 使用GetModuleFileNameEx函數。

因此,你必須使用GetModuleFileNameExGetWindowThreadProcessId/GetForegroundWindow結合。這將返回你所需要的:

uses 
    Winapi.Windows, Winapi.PsAPI, System.SysUtils; 

function GetCurrentActiveProcessPath: String; 
var 
    pid  : DWORD; 
    hProcess: THandle; 
    path : array[0..4095] of Char; 
begin 
    GetWindowThreadProcessId(GetForegroundWindow, pid); 

    hProcess := OpenProcess(PROCESS_QUERY_INFORMATION or PROCESS_VM_READ, FALSE, pid); 
    if hProcess <> 0 then 
    try 
     if GetModuleFileNameEx(hProcess, 0, @path[0], Length(path)) = 0 then 
     RaiseLastOSError; 

     result := path; 
    finally 
     CloseHandle(hProcess); 
    end 
    else 
    RaiseLastOSError; 
end; 
+0

想必'GetWindowModuleFileName()'是自1定製包裝器)它不是一個API函數,和2),它被傳遞一個'HWND'作爲參數。 'GetModuleFileName/Ex()'代替'HMODULE'。順便說一句,還有['GetProcessImageFileName()'](http://msdn.microsoft.com/en-us/library/windows/desktop/ms683217.aspx)和['QueryFullProcessImageName()'](http:// msdn.microsoft.com/en-us/library/windows/desktop/ms684919.aspx)可用的API函數。他們不需要'PROCESS_VM_READ'權限。實際上,他們甚至使用'PROCESS_QUERY_LIMITED_INFORMATION'權限。 –

+0

你確定*它不是一個API函數,@Remy? http://msdn.microsoft.com/en-us/library/windows/desktop/ms633517.aspx –

+0

@RobKennedy:我學到了一些新東西。我以前從來沒有聽說過這個API函數。但是,我沒有看到它的文檔中的任何內容禁止它獲取屬於另一個進程的窗口的文件名。 AFAIK該限制僅適用於'GetModuleFileName()',其文檔是Marko引用的。我將不得不測試'GetWindowModuleFileName()'並且看看會發生什麼。 –

3

GetActiveWindow僅獲取屬於調用線程的活動窗口的窗口句柄。

您需要使用GetForegroundWindow()函數而不是GetActiveWindow()

相關問題