Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Delphi 如何从窗口句柄获取可执行文件名?_Delphi_Winapi - Fatal编程技术网

Delphi 如何从窗口句柄获取可执行文件名?

Delphi 如何从窗口句柄获取可执行文件名?,delphi,winapi,Delphi,Winapi,我有以下代码: procedure TForm1.Button1Click(Sender: TObject); var MyHandle: THandle; begin MyHandle:=FindWindow(nil, 'Delphi'); SendMessage(MyHandle, WM_CLOSE, 0, 0); // Here will be a message like ' title found and it's test.exe that has 'Delphi' T

我有以下代码:

procedure TForm1.Button1Click(Sender: TObject);
var
  MyHandle: THandle;
begin
  MyHandle:=FindWindow(nil, 'Delphi');
  SendMessage(MyHandle, WM_CLOSE, 0, 0);
 // Here will be a message like ' title found and it's test.exe that has 'Delphi' Title
end;

例如,
test.exe
是具有
'Delphi'
标题的进程,我想使用窗口句柄获取该进程的exe文件名。可能吗?如果是这样,我可以提供一些参考吗?

如果有任何有效的
HWND
,您可以执行以下操作:

  • 用于获取创建它的进程ID
  • 然后使用打开该进程的
    句柄
  • 然后使用或(取决于操作系统版本)获取创建该进程的EXE的文件路径

    • 这是我使用的一个程序,您可能会在互联网上的其他地方找到它。我不记得确切的来源,可能是


      ++@AndreasRejbrand谢谢。当您可以直接获得所需信息时,为什么要拍摄所有进程的快照?为什么您的功能总是声称成功?当
      重复
      循环更有意义时,为什么要使用
      found
      while
      循环之类的变量呢?
      uses
        Windows, TlHelp32, ...
      
      function WindowHandleToEXEName(handle : THandle) : string;
      var
        snap : THandle;
        pe : tagPROCESSENTRY32;
        pid : THandle;
        found : boolean;
      begin
        Windows.SetLastError(ERROR_SUCCESS);
      
        result := '';
        if (handle = 0) then exit;
      
        snap := TLHelp32.CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
        if (snap = Cardinal(-1)) then exit;
      
        Windows.GetWindowThreadProcessId(handle, @pid);
        pe.dwSize := Sizeof(pe);
        found := TLHelp32.Process32First(snap, pe);
      
        while found do
        begin
          if (pe.th32ProcessID = pid) then
          begin
            result := String(pe.szExeFile);
            break;
          end;
          found := TLHelp32.Process32Next(snap, pe);
        end;
        CloseHandle(snap);
      end;