这是我现在正在做的一个例子:
var
Client : String;
Handle : Integer;
begin
Client := 'Window Name';
GetWindowThreadProcessId(FindWindow(nil, PAnsiChar(Client)), @ProcessId);
Handle := OpenProcess(PROCESS_ALL_ACCESS, False, ProcessId);
end;
Run Code Online (Sandbox Code Playgroud)
我宁愿抓住进程的句柄及其 exe 名称...这可能吗?
由于 vcldeveloper 提供的链接已损坏,因此这里是无需第 3 方组件即可工作的完整功能代码。
首先,我们将找到进程 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 not SameText(procE.szExeFile, processName) then
repeat GotProcess := Process32Next(tempHandle, procE);
until (not GotProcess) or SameText(procE.szExeFile,processName);
{$B+}
if GotProcess then
result := procE.th32ProcessID
else
result := 0; // process not found in running process list
CloseHandle(tempHandle);
end;
Run Code Online (Sandbox Code Playgroud)
接下来,我们将从我们获得的 PID 中获取/打开进程句柄。整个代码/用法如下:
var myPID, myProcessHandle: integer;
begin
myPID:=GetPIDbyProcessName('someExeName.exe');
myProcessHandle:=OpenProcess(PROCESS_ALL_ACCESS,False,myPID);
end;
Run Code Online (Sandbox Code Playgroud)
您应该存储myProcessHandle您应该以可作为第一个参数访问的方式
ReadProcessMemory(myProcessHandle...)。
另外,将这些添加到全局使用子句中:(
Winapi.Windows用于 ReadProcessMemory 和 OpenProcess)
Winapi.tlHelp32(用于获取 PID tProcessEntry32 变量)