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等)总是会崩溃。我不知道为什么。