2011-01-30 4 views
3

Вот пример того, как я делаю это прямо сейчас:Delphi Получить ручку EXE

var 
Client : String; 
Handle : Integer; 
begin 
Client := 'Window Name'; 
GetWindowThreadProcessId(FindWindow(nil, PAnsiChar(Client)), @ProcessId); 
Handle := OpenProcess(PROCESS_ALL_ACCESS, False, ProcessId); 
end; 

Я предпочел бы схватить ручку процесса с его именем ехе ... Возможно ли это это ?

+1

Что «осилить окно ручки (HWND), модуль ручки? (HMODULE) или какой-нибудь другой дескриптор? –

+0

дескриптор окна (HWND) – Bryan

+0

Затем я также должен спросить: «В каком окне?» В одном приложении (EXE) может быть много окон, некоторые из которых могут быть даже невидимыми (даже не формы). «Главное» окно или окно «невидимое» «приложение»? –

ответ

2

Вы можете использовать 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 в как он извлекает список запущенных процессов и их свойства. В основном это относится к API справки Windows Tool для большинства его функций.

+0

Я никогда не смогу найти какие-либо свободные компоненты>.> И я все еще изучаю delphi спасибо за помощь :) heh почти получил достаточно репутации, чтобы проголосовать за вас – Bryan

+1

Ссылка есть broken – Max

+0

Что такое единичный файл ProcessInfo – Ishanka

3

Application.Handle?
Похоже, вы пытаетесь запрограммировать в Delphi WinAPI. В подавляющем большинстве это не нужно, VCL предоставляет соответствующие объектно-ориентированные обертки.
Может быть вы найдете что-то в этом компоненте пакета: GLibWMI

+0

mabye я должен указать это внешнее приложение .. – Bryan

+0

У меня такое чувство, что OP не ищет дескриптор собственного приложения. –

+0

№ К сожалению, я пока не установил поддержку WinAPI.Но вы можете попытаться получить помощь, начиная с функции API «EnumProcesses», например, – Abelisto

0

Поскольку ссылка, предоставленная vcldeveloper, сломана, вот полный функциональный код, который работает без сторонних компонентов.

Сначала мы найдем идентификатор процесса (PID), а затем мы получим дескриптор процесса, открыв все доступ (так как OP, упомянутый в комментариях, он понадобится для функции ReadProcessMemory).

Если функция ПИД возвращает значение 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; 

Далее, мы получим/открыть дескриптор процесса из ПИД-код, который мы получили. Весь код/​​использование выглядит следующим образом:

var myPID, myProcessHandle: integer; 
begin 
    myPID:=GetPIDbyProcessName('someExeName.exe'); 
    myProcessHandle:=OpenProcess(PROCESS_ALL_ACCESS,False,myPID); 
end; 

Вы должны хранить myProcessHandle таким образом, что для
, доступная ReadProcessMemory(myProcessHandle...) в качестве первого параметра.

Кроме того, добавить их к своим глобальным использований статей:
Winapi.Windows (для ReadProcessMemory и OpenProcess)
Winapi.tlHelp32 (для получения переменной PID tProcessEntry32)

Смежные вопросы