这是我现在正在做的一个例子:
var
Client : String;
Handle : Integer;
begin
Client := 'Window Name';
GetWindowThreadProcessId(FindWindow(nil, PAnsiChar(Client)), @ProcessId);
Handle := OpenProcess(PROCESS_ALL_ACCESS, False, ProcessId);
end;
我宁愿用它的exe名称抓取Process的句柄...... 这有可能吗?
答案 0 :(得分:4)
Application.Handle
?
看起来你正试图通过WinAPI在Delphi中编程。在绝大多数不需要它的情况下,VCL提供了适当的面向对象的包装器
可能你会在这个组件包中找到一些东西:GLibWMI
答案 1 :(得分:1)
您可以使用ProcessInfo:
var
ProcessInfo : TProcessInfo;
Process : TProcessItem;
PID: Cardinal;
ProcessHandle : THandle;
begin
ProcessInfo := TProcessInfo.Create(nil);
try
Process := ProcessInfo.RunningProcesses.FindByName('Notepad.exe');
if Assigned(Process) then
begin
PID := Process.ProcessID;
ProcessHandle := OpenProcess(PROCESS_ALL_ACCESS,False,PID);
if ProcessHandle > 0 then
try
{Add your code here}
finally
CloseHandle(ProcessHandle);
end;
end;
finally
ProcessInfo.Free;
end;
end;
如果您不喜欢使用第三方组件,可以学习ProcessInfo的源代码,以了解它如何检索正在运行的进程列表及其属性。基本上它会在Windows Tool Help API上传递其大部分功能。
答案 2 :(得分:0)
由于vcldeveloper提供的链接已损坏,因此这里没有第三方组件的完整功能代码。
首先我们将找到进程ID(PID),然后我们通过打开所有访问来获得进程句柄(因为注释中提到的OP将需要这个用于ReadProcessMemory功能)。
如果PID的函数返回0,则表示该进程很可能没有运行(或者在运行的进程列表中找不到)
function GetPIDbyProcessName(processName:String):integer;
var
GotProcess: Boolean;
tempHandle: tHandle;
procE: tProcessEntry32;
begin
tempHandle:=CreateToolHelp32SnapShot(TH32CS_SNAPALL, 0);
procE.dwSize:=SizeOf(procE);
GotProcess:=Process32First(tempHandle, procE);
{$B-}
if GotProcess and (procE.szExeFile <> processName) then
repeat GotProcess := Process32Next(tempHandle, procE);
until (not GotProcess) or (procE.szExeFile = processName);
{$B+}
if GotProcess then
result := procE.th32ProcessID
else
result := 0; // process not found in running process list
CloseHandle(tempHandle);
end;
接下来,我们将从我们获得的PID中获取/打开Process句柄。整个代码/用法如下:
var myPID, myProcessHandle: integer;
begin
myPID:=GetPIDbyProcessName('someExeName.exe');
myProcessHandle:=OpenProcess(PROCESS_ALL_ACCESS,False,myPID);
end;
您应该以{{1}}作为第一个参数访问myProcessHandle
的方式存储ReadProcessMemory(myProcessHandle...)
。
另外,将这些添加到您的全局使用条款中:
Winapi.Windows
(对于ReadProcessMemory和OpenProcess)
Winapi.tlHelp32
(用于获取PID tProcessEntry32变量)