![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#1
|
|||
|
|||
|
Здравствуйте! Написал следующий код для нахождения процесса:
Код:
Function PId(Exename:string):Dword;
var snap:DWORD;
pe:TprocessEntry32;
begin
result:=0;
snap:=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
if snap <>INVALID_HANDLE_VALUE then begin
pe.dwSize:=sizeof(TPROCESSENTRY32);
if process32First(snap,pe) then
repeat
if pe.szExeFile=exename then begin
result:=pe.th32ProcessID;
closehandle(snap);
exit;
end;
until not process32Next(snap,pe);
closehandle(snap);
result:=0;
end;
end;
function OpenProc(id:integer):boolean;
var
hProcess:THandle;
begin
hProcess:=OpenProcess(PROCESS_ALL_ACCESS,false,id);
if hProcess = 0 then begin
ShowMessage('Процесс не найден');
end else
ShowMessage('Процесс ok!');
end;Код:
procedure TForm1.Button1Click(Sender: TObject);
begin
OpenProc(PId('calc.exe'))
end;На Windows 7 все работает отлично, но на Windows XP почему то не находит процесс. Точнее я знаю почему, типа xp не дружит с PROCESS_ALL_ACCESS, но не знаю как можно это исправить, подскажите пожалуйста) Последний раз редактировалось DarkSmile, 20.03.2013 в 16:14. |
|
#2
|
||||
|
||||
|
И XP также работает.
|
|
#3
|
|||
|
|||
|
А все понял. Вот есть такой код поиска всех запусщеных процессов:
Код:
procedure GetProcessList(var sl: TStrings);
var
pe: TProcessEntry32;
ph, snap: THandle; //дескрипторы процесса и снимка
mh: hmodule; //дескриптор модуля
procs: array[0..$FFF] of dword; //массив для хранения дескрипторов процессов
count, cm: cardinal; //количество процессов
i: integer;
ModName: array[0..max_path] of char; //имя модуля
Wnd : hWnd;
buff: array[0..$FFF] of char;
begin
sl.Clear;
if Win32Platform = VER_PLATFORM_WIN32_WINDOWS then
begin //если это Win9x
snap := CreateToolhelp32Snapshot(th32cs_snapprocess, 0);
if integer(snap) = -1 then
begin
exit;
end
else
begin
pe.dwSize := sizeof(pe);
if Process32First(snap, pe) then
repeat
sl.Add(string(pe.szExeFile));
until not Process32Next(snap, pe);
end;
end
else
begin //Если WinNT/2000/XP
if not EnumProcesses(@procs, sizeof(procs), count) then
begin
exit;
end;
for i := 0 to count div 4 - 1 do
begin
ph := OpenProcess(PROCESS_QUERY_INFORMATION or PROCESS_VM_READ,
false, procs[i]);
if ph > 0 then
begin
EnumProcessModules(ph, @mh, 4, cm);
GetModuleFileNameEx(ph, mh, ModName, sizeof(ModName));
sl.Add(ExtractFileName(string(ModName));
CloseHandle(ph);
end;
end;
end;
end;Код:
Form6.ListBox1.Clear;
// Получаем hWnd первого окна
Wnd := GetWindow(Form6.Handle, gw_HWndFirst);
// Цикл поиска окон
WHILE Wnd <> 0 DO BEGIN
IF (Wnd <> Application.Handle) AND // -Собственное окно
IsWindowVisible(Wnd) AND // -Невидимые окна
(GetWindow(Wnd, gw_Owner) = 0) AND // -Дочернии окна
(GetWindowText(Wnd, buff, sizeof(buff)) <> 0) // -Окна без заголовков
THEN BEGIN
GetWindowText(Wnd, buff, sizeof(buff));
Form6.ListBox1.Items.Add(StrPas(buff));
END;
// Ищем новое окно
Wnd := GetWindow(Wnd, gw_hWndNext);
END;
Form6.ListBox1.ItemIndex := 0; |
|
#4
|
|||
|
|||
|
Осмелюсь предложить - что-то - где-то - как-то так:
Код:
Function PId(Exename:string):Dword;
var
snap:DWORD;
pe:TprocessEntry32;
Wnd : hWnd;
buff: array[0..Max_Path] of char;
tmpPID: DWord;
begin
result:= 0;
snap:= CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
if snap <> INVALID_HANDLE_VALUE then
begin
pe.dwSize:= sizeof(TPROCESSENTRY32);
if process32First(snap, pe) then
repeat
Wnd := GetWindow(Application.Handle, gw_HWndFirst);
WHILE Wnd <> 0 DO
BEGIN // Цикл поиска окон
IF (Wnd <> Application.Handle) AND // -Собственное окно
IsWindowVisible(Wnd) AND // -Невидимые окна
(GetWindow(Wnd, gw_Owner) = 0) AND// -Дочерние окна
(GetWindowText(Wnd, buff, sizeof(buff)) <> 0) // -Окна без заголовков
THEN
BEGIN
GetWindowText(Wnd, buff, sizeof(buff));
GetWindowThreadProcessId(Wnd, @tmpPID);
If tmpPID = pe.th32ProcessID then
form1.Memo1.Lines.Add(pe.szExeFile + ' = ' + StrPas(buff));
END;
Wnd := GetWindow(Wnd, gw_hWndNext); // Ищем новое окно
END;
if CompareText(pe.szExeFile, exename) = 0 then
begin
result:= pe.th32ProcessID;
closehandle(snap);
exit;
end;
until not process32Next(snap,pe);
closehandle(snap);
result:= 0;
end;
end;function OpenProc(id: Cardinal):boolean; |
|
#5
|
|||
|
|||
|
З. Ы. Ай Эм Вэри Сорри за полугодовую задержку (до этого как-то не требовалось то, через что Гугл ткнул меня в эту тему, да и Автор за это время мож нашёл более грациозное решение своей задачи [к стати - не отписался]) и прошу: казнить нельзя - помиловать (мабудь моя "стряпня" кому-нить из новичков типа меня или Автора [темы] на чё-нить, да сгодится...)
P. P. S. И самое парадоксальное: Цитата:
Цитата:
Код:
VirtualProtect(Pointer(BaseAddr), SizeOf(MBI), PAGE_EXECUTE_READWRITE, OldPageProtection); |