我想获取当前活动Window的可执行文件的路径。
我试过了:
var
WindowModuleFileName : array[0..100] of Char;
sourceWindow: Hwnd;
begin
sourceWindow := GetActiveWindow;
GetWindowModuleFileName(sourceWindow, PChar(WindowModuleFileName), sizeof(WindowModuleFileName));
ShowMessage(WindowModuleFileName);
end;
但只有当我的应用程序窗口处于活动状态时,它才会返回正确答案 我做错了什么?
答案 0 :(得分:4)
如GetModuleFileName MSDN所述,您无法使用GetWindowModuleFileName
查找除您自己以外的其他流程的文件:
检索包含指定模块的文件的完全限定路径。该模块必须已由当前进程加载。
要找到另一个进程加载的模块的文件, 使用GetModuleFileNameEx函数。
因此,您必须将GetModuleFileNameEx
与GetWindowThreadProcessId
/ 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()
。