Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: WinAPI и системное программирование > как в программе узнать запущена другая программа?


Автор: зятьМижуев 11.12.2004, 11:25
Здравствуйте . Прошу сообщить , как в программе узнать запущена другая программа или нет .

Автор: SPrograMMer 11.12.2004, 12:20
Как так?! Какая программа? Своя собственная?
Можно поточнее...

Автор: Ddddddelphi 11.12.2004, 12:43
а может через WinApi?

Автор: Bes 11.12.2004, 13:00
Найди в нете такую хелпу как Kuliba. Там точно было.
Способ еще зависит от того имеет ли др. приложение окно иил нет.

Вот из кулибы.
"
Получение списка запущеных приложений

Igor Nikolaev aKa The Sprite предлагает следующий код:


--------------------------------------------------------------------------------
Код
procedure TForm1.Button1Click(Sender: TObject);
VAR
Wnd : hWnd;
buff: ARRAY [0..127] OF Char;
begin
ListBox1.Clear;
Wnd := GetWindow(Handle, gw_HWndFirst);
WHILE Wnd <> 0 DO BEGIN {Hе показываем:}
IF (Wnd <> Application.Handle) AND {-Собственное окно}
IsWindowVisible(Wnd) AND {-Hевидимые окна}
(GetWindow(Wnd, gw_Owner) = 0) AND {-Дочернии окна}
(GetWindowText(Wnd, buff, sizeof(buff)) <> 0)
THEN BEGIN
GetWindowText(Wnd, buff, sizeof(buff));
ListBox1.Items.Add(StrPas(buff));
END;
Wnd := GetWindow(Wnd, gw_hWndNext);
END;
ListBox1.ItemIndex := 0;
end;  
"

Еще оттуда же.
"
Как получить хэндлы всех пpоцессов, котоpые запущены на данный момент в системе?

Nomadic отвечает:
Под Windows 95 это возможно с использованием вспомогательных инфоpмационных функций (tool help functions).

Для получения списка пpоцессов надо делать следующее:

Cпеpва вызывается фукция 
--------------------------------------------------------------------------------
    hSnapshot := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0)
// - получение снимка состояния системы  


Process32First() - получене инфоpмации о пеpвом пpоцессе в списке

Далее в цикле Process32Next() - получение инфоpмации о следующем пpоцессе в списке
Пример:
>== Режем pаз ==>



--------------------------------------------------------------------------------
    unit KernlUtl;

interface
uses TlHelp32, Windows, Classes, Sysutils;

procedure GetProcessList(List: TStrings);
procedure GetModuleList(List: TStrings);
function GetProcessHandle(ProcessID: DWORD): THandle;
procedure GetParentProcessInfo(var ID: DWORD; var Path: String);

const


PROCESS_TERMINATE         =  $0001;
PROCESS_CREATE_THREAD     =  $0002;
PROCESS_VM_OPERATION      =  $0008;
PROCESS_VM_READ           =  $0010;
PROCESS_VM_WRITE          =  $0020;
PROCESS_DUP_HANDLE        =  $0040;
PROCESS_CREATE_PROCESS    =  $0080;
PROCESS_SET_QUOTA         =  $0100;
PROCESS_SET_INFORMATION   =  $0200;
PROCESS_QUERY_INFORMATION =  $0400;
PROCESS_ALL_ACCESS        =
STANDARD_RIGHTS_REQUIRED or SYNCHRONIZE or $0FFF;


implementation

procedure GetProcessList(List: TStrings);
var

I: Integer;
hSnapshoot: THandle;
pe32: TProcessEntry32;
begin

List.Clear;
hSnapshoot := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);


if (hSnapshoot = -1) then
Exit;
pe32.dwSize := SizeOf(TProcessEntry32);
if (Process32First(hSnapshoot, pe32)) then
repeat
I := List.Add(Format('%x, %x: %s',
[pe32.th32ProcessID, pe32.th32ParentProcessID, pe32.szExeFile]));
List.Objects[I] := Pointer(pe32.th32ProcessID);
until not Process32Next(hSnapshoot, pe32);


CloseHandle (hSnapshoot);
end;

procedure GetModuleList(List: TStrings);
var

I: Integer;
hSnapshoot: THandle;
me32: TModuleEntry32;
begin

List.Clear;
hSnapshoot := CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, 0);
if (hSnapshoot = -1) then
Exit;
me32.dwSize := SizeOf(TModuleEntry32);
if (Module32First(hSnapshoot, me32)) then
repeat
I := List.Add(me32.szModule);
List.Objects[I] := Pointer(me32.th32ModuleID);
until not Module32Next(hSnapshoot, me32);


CloseHandle (hSnapshoot);
end;

procedure GetParentProcessInfo(var ID: DWORD; var Path: String);
var

ProcessID: DWORD;
hSnapshoot: THandle;
pe32: TProcessEntry32;
begin

ProcessID := GetCurrentProcessID;
ID := -1;
Path := '';


hSnapshoot := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);


if (hSnapshoot = -1) then
Exit;


pe32.dwSize := SizeOf(TProcessEntry32);
if (Process32First(hSnapshoot, pe32)) then
repeat
if pe32.th32ProcessID = ProcessID then
begin
ID := pe32.th32ParentProcessID;
Break;
end;
until not Process32Next(hSnapshoot, pe32);


if ID <> -1 then
begin
if (Process32First(hSnapshoot, pe32)) then
repeat
if pe32.th32ProcessID = ID then
begin
Path := pe32.szExeFile;
Break;
end;
until not Process32Next(hSnapshoot, pe32);
end;
CloseHandle (hSnapshoot);
end;

function GetProcessHandle(ProcessID: DWORD): THandle;
begin

Result := OpenProcess(PROCESS_ALL_ACCESS, True, ProcessID);
end;

end.  

"


P.S. седовательно надо это понимать так, что процесс иприложение не одно и то же.

Автор: Medved 11.12.2004, 14:47
Используй FindWindow для главного окна чужого приложения. Это тебе и есть WinApi.

Цитата
The FindWindow function retrieves the handle to the top-level window whose class name and window name match the specified strings. This function does not search child windows.

HWND FindWindow(

    LPCTSTR lpClassName, // pointer to class name
    LPCTSTR lpWindowName  // pointer to window name
  );


Parameters

lpClassName

Points to a null-terminated string that specifies the class name or is an atom that identifies the class-name string. If this parameter is an atom, it must be a global atom created by a previous call to the GlobalAddAtom function. The atom, a 16-bit value, must be placed in the low-order word of lpClassName; the high-order word must be zero.

lpWindowName

Points to a null-terminated string that specifies the window name (the window's title). If this parameter is NULL, all window names match.


Return Values

If the function succeeds, the return value is the handle to the window that has the specified class name and window name.
If the function fails, the return value is NULL. To get extended error information, call GetLastError.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)