program Project1; {$APPTYPE CONSOLE} {$R *.res} uses System.SysUtils, TlHelp32,Classes, PsAPI, Windows; function GetProcessNameFromWnd(Wnd: HWND): string; function RunningProcessesList(const List: TStrings; FullPath: Boolean): Boolean; function ProcessFilename(PID: DWORD): string; var Handle: THandle; begin Result := ''; Handle := OpenProcess(PROCESS_QUERY_INFORMATION or PROCESS_VM_READ, False, PID); if Handle <> 0 then try SetLength(Result, MAX_PATH); if FullPath then begin if GetModuleFileNameEx(Handle, 0, PChar(Result), MAX_PATH) > 0 then SetLength(Result, strlen(PChar(Result))) else Result := ''; end else begin if GetModuleBaseName(Handle, 0, PChar(Result), MAX_PATH) > 0 then SetLength(Result, StrLen(PChar(Result))) else Result := ''; end; finally CloseHandle(Handle); end; end; var SnapProcHandle: THandle; ProcEntry: TProcessEntry32; NextProc: Boolean; Filename: string; begin SnapProcHandle := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); Result := (SnapProcHandle <> INVALID_HANDLE_VALUE); if Result then try ProcEntry.dwSize := SizeOf(ProcEntry); NextProc := Process32First(SnapProcHandle, ProcEntry); while NextProc do begin if ProcEntry.th32ProcessID = 0 then begin Filename := 'System Idle Process'; end else begin Filename := ProcessFilename(ProcEntry.th32ProcessID); if Filename = '' then Filename := ProcEntry.szExeFile; end; List.AddObject(Filename, Pointer(ProcEntry.th32ProcessID)); NextProc := Process32Next(SnapProcHandle, ProcEntry); end; finally CloseHandle(SnapProcHandle); end; end; var List: TStringList; PID: DWORD; I: Integer; begin Result := ''; if IsWindow(Wnd) then begin PID := INVALID_HANDLE_VALUE; GetWindowThreadProcessId(Wnd, @PID); List := TStringList.Create; try if RunningProcessesList(List, True) then begin I := List.IndexOfObject(Pointer(PID)); if I > -1 then Result := List[I]; end; finally List.Free; end; end; end; var h:HWND; begin try { TODO -oUser -cConsole Main : Insert code here } h:= FindWindow(nil,'任务管理器'); Writeln(GetProcessNameFromWnd(h)); readln; except on E: Exception do Writeln(E.ClassName, ': ', E.Message); end; end.
Copyright © 2014 DelphiW.com 开发 源码 文档 技巧 All Rights Reserved
晋ICP备14006235号-8 晋公网安备 14108102000087号
执行时间: 0.1220018863678 seconds