簡體   English   中英

如何獲取當前活動應用程序窗口的路徑?

[英]How to get path of current active application window?

我想獲取當前活動窗口的可執行文件的路徑。

我試過了:

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

但是只有當我的應用程序窗口處於活動狀態時,它才返回正確答案。 我究竟做錯了什么?

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;

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

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM