Delphi获取EXE的句柄

Delphi获取EXE的句柄,delphi,Delphi,下面是我现在如何做的一个例子: var Client : String; Handle : Integer; begin Client := 'Window Name'; GetWindowThreadProcessId(FindWindow(nil, PAnsiChar(Client)), @ProcessId); Handle := OpenProcess(PROCESS_ALL_ACCESS, False, ProcessId); end; 我宁愿用它的exe名称来抓取进程的句柄。。。

下面是我现在如何做的一个例子:

var
Client : String;
Handle : Integer;
begin
Client := 'Window Name';
GetWindowThreadProcessId(FindWindow(nil, PAnsiChar(Client)), @ProcessId);
Handle := OpenProcess(PROCESS_ALL_ACCESS, False, ProcessId);
end;
我宁愿用它的exe名称来抓取进程的句柄。。。
这是可能的吗?

应用程序。句柄?
看起来您正试图通过WinAPI在Delphi中编程。在绝大多数情况下,VCL都不需要它,它提供了适当的面向对象包装器。
您可能会在这个组件包中找到一些东西:

您可以使用:


如果您不喜欢使用第三方组件,可以研究ProcessInfo的源代码,了解它如何检索正在运行的进程列表及其属性。基本上,它的大部分功能都依赖于Windows工具帮助API

由于vcldeveloper提供的链接已断开,下面是在没有第三方组件的情况下运行的完整功能代码

首先我们将找到进程id(PID),然后我们将通过打开所有访问来获得进程句柄(因为OP在注释中提到,他将需要这个来实现ReadProcessMemory功能)

如果PID函数返回0,则表示该进程很可能没有运行(或只是在运行进程列表中找不到)

您应该将
myProcessHandle
作为第一个参数存储在可供
ReadProcessMemory(myProcessHandle…
访问的位置

另外,将这些添加到全局使用子句中:
Winapi.Windows
(用于ReadProcessMemory和OpenProcess)

Winapi.tlHelp32
(用于获取PID TProcesentry32变量)

什么“句柄”?窗口句柄(HWND)、模块句柄(HMODULE),或其他句柄?好的,那么您真正需要的句柄实际上是一个进程句柄,而不是窗口句柄。您已经有了什么可以用来获取进程句柄?如果您只有EXE名称,那么可以有多个EXE副本在运行,并且…?请参阅类似的问题--这里的答案也适用于您的问题。@W奥姆:恐怕我不得不同意布莱恩的看法。事实上,你在SO的大部分评论(仅算上我见过的评论)实际上都是同一类的,暗示着“上帝,这无知杀了我!”!为了你自己,如果没有别的,你可以考虑重新调整你的Actuple生成器。只是说……我感觉到OP不是在寻找自己应用程序的句柄。没有。不幸的是,我现在还没有安装WiNAPI帮助。但是你可以尝试从API函数<代码>枚举进程< /C>中获得帮助。example@Andreas Rejbrand看起来像是@Bryan试图在Delphi上编写病毒。只是一个玩笑。很抱歉没有主题。@Abelisto@Bryan正在尝试使用SendKeys@Abelisto,您应该编辑或删除您的答案,因为从新的角度来看,它与问题无关。我永远找不到任何免费组件>>,我是sti我将学习德尔福的帮助:“Heh几乎得到足够的代表来投票给你。链接不仅被破坏了。我认为它是妥协的。网站想在我的电脑上安装一些东西。没有办法,JoeSee。这个链接工作;-)你的代码工作完美。只是小的改进,使它不区分大小写:而过程和(不是)(procE.szExeFile,AppName))do GotProcess:=Process32Next(tempHandle,procE);
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;
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;
var myPID, myProcessHandle: integer;
begin
  myPID:=GetPIDbyProcessName('someExeName.exe');
  myProcessHandle:=OpenProcess(PROCESS_ALL_ACCESS,False,myPID);
end;