如何获取当前活动应用程序窗口的路径?

时间:2014-02-25 00:27:06

标签: windows delphi lazarus

我想获取当前活动Window的可执行文件的路径。

我试过了:

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

但只有当我的应用程序窗口处于活动状态时,它才会返回正确答案 我做错了什么?

2 个答案:

答案 0 :(得分:4)

GetModuleFileName MSDN所述,您无法使用GetWindowModuleFileName查找除您自己以外的其他流程的文件:

  

检索包含指定模块的文件的完全限定路径。该模块必须已由当前进程加载。

     

要找到另一个进程加载的模块的文件,   使用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;

答案 1 :(得分:3)

GetActiveWindow获取仅属于调用线程的活动窗口的窗口句柄。

您需要使用GetForegroundWindow()功能代替GetActiveWindow()