Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Windows 如何获取当前活动应用程序窗口的路径?_Windows_Delphi_Lazarus - Fatal编程技术网

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

Windows 如何获取当前活动应用程序窗口的路径?,windows,delphi,lazarus,Windows,Delphi,Lazarus,我想获取当前活动窗口的可执行文件的路径 我试过: var WindowModuleFileName : array[0..100] of Char; sourceWindow: Hwnd; begin sourceWindow := GetActiveWindow; GetWindowModuleFileName(sourceWindow, PChar(WindowModuleFileName), sizeof(WindowModuleFileName));

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

我试过:

var
  WindowModuleFileName : array[0..100] of Char;  
  sourceWindow: Hwnd;      
begin
  sourceWindow := GetActiveWindow;
  GetWindowModuleFileName(sourceWindow, PChar(WindowModuleFileName), sizeof(WindowModuleFileName));    
  ShowMessage(WindowModuleFileName);    
end;
但它只有在我的应用程序窗口处于活动状态时才返回正确答案。
我做错了什么?

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


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

您不能使用
GetWindowModuleFileName
来定位除您自己的进程之外的其他进程的文件,如下所述:

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

要查找由另一个进程加载的模块的文件, 使用GetModuleFileNameEx函数

因此,必须将
GetModuleFileNameEx
GetWindowThreadProcessId
/
getForeGroundIndow
结合使用。这将返回您所需的:

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;
使用
Windows、Winapi.PsAPI、System.SysUtils;
函数GetCurrentActiveProcessPath:String;
变量
pid:DWORD;
hproces:THandle;
路径:字符的数组[0..4095];
开始
GetWindowThreadProcessId(GetForegroundWindow,pid);
HPPROCESS:=OpenProcess(进程查询信息或进程虚拟机读取,FALSE,pid);
如果hProcess为0,则
尝试
如果GetModuleFileNameEx(hProcess,0,@path[0],Length(path))=0,则
赖斯·塞罗;
结果:=路径;
最后
CloseHandle(hProcess);
结束
其他的
赖斯·塞罗;
结束;

假定
GetWindowModuleFileName()
是一个自定义包装器,因为1)它不是API函数,2)它作为参数传递
HWND
GetModuleFileName/Ex()
需要一个
HMODULE
。顺便说一句,还有和API函数可用。他们不需要
PROCESS\u VM\u READ
权限。事实上,它们甚至可以使用
PROCESS\u QUERY\u LIMITED\u INFORMATION
权限。你确定这不是API函数吗,@Remy@罗布·肯尼迪:我学到了一些新东西。我以前从未听说过这个API函数。但是,我在它的文档中没有看到任何东西禁止它获取属于另一个进程的窗口的文件名。假设该限制仅适用于
GetModuleFileName()
,其文档是Marko引用的。我必须测试
GetWindowModuleFileName()
,看看会发生什么。大多数程序都可以这样做,但某些特定程序(如KeePass、DOpus等)总是会崩溃。我不知道为什么。