PDA

View Full Version : سوال : بدست آوردن ليست پروسه هاي در حال اجرا ؟



BORHAN TEC
جمعه 24 مهر 1388, 13:32 عصر
مدتي است كه به دنبال كدي مي گردم كه بتواند ليستي از پروسه هاي در حال اجرا تهيه كند. بايد بگويم كه اين كار را با استفاده از كد زير انجام داده ام ولي مشكل اين جا است كه نميتوانم مسير اين فايلها را بدست آورم.(به عنوان مثال c:\new Folder\1.exe)


var
hSnapshot : LongInt;
info : PROCESSENTRY32W;
s : longbool;
exeName : string;
retval : LongInt;
begin
ListBox1.Items.Clear;
hSnapshot := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);

info.dwSize := SizeOf(info);

s := Process32FirstW(hSnapshot,info);
while s<>false do begin
ListBox1.Items.Add(info.szExeFile);
info.dwSize := sizeof(info);
s :=Process32NextW(hSnapshot, info);
end;

CloseHandle(hSnapshot);
end;

در ضمن براي اين كه اين كد كار كند بايد tlhelp32 را نيز به قسمت uses اضافه كنيد.

merced
جمعه 24 مهر 1388, 18:01 عصر
از اين استفاده كن، فكر كنم اون كاري كه مي خواي بكنه . تست نكردم.
http://vcldeveloper.com/downloads/ProcessInfo.zip

Tasnim
جمعه 24 مهر 1388, 21:45 عصر
function EnumWindowsProc(wHandle: HWND; lb: TListBox): Bool; stdcall; export;
var
Title, ClassName: array[0..255] of char;
begin
Result := True;
GetWindowText(wHandle, Title, 255);
GetClassName(wHandle, ClassName, 255);
if IsWindowVisible(wHandle) then
lb.Items.Add(string(Title) ); //string(ClassName)
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
EnumWindows(@EnumWindowsProc, Integer(Listbox1));
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
ShowMessage(IntToStr(FindWindow(nil, pchar( ListBox1.Items[ListBox1.ItemIndex]))));
SendMessage(FindWindow(nil, pchar( ListBox1.Items[ListBox1.ItemIndex])),WM_CLOSE,0,0)
end;

vcldeveloper
جمعه 24 مهر 1388, 23:26 عصر
function EnumWindowsProc(wHandle: HWND; lb: TListBox): Bool; stdcall; export;
لیست پنجره های باز مساوی لیست Processهای در حال اجرا نیست. در تاپیک دیگه این مورد را توضیح دادم.
EnumWindowsProc فقط لیست پنجره های Top-Level رو برمیگردونه، و ربطی به لیست Processهای در حال اجرا نداره.


مشكل اين جا است كه نميتوانم مسير اين فايلها را بدست آورم.(به عنوان مثال c:\new Folder\1.exe)
TProcessList که آقای merced لینکش را دادند، این کار را انجام میده. درباره اش در اینجا توضیح دادم:
http://vcldeveloper.com/2009/09/08/process-info/
http://vcldeveloper.com/2009/09/11/how-to-use-tprocessinfo/

برای اینکه ببینید چطور مسیر فایل EXE رو بدست میاره، می تونید سورس آن را مطالعه کنید.

Felony
جمعه 24 مهر 1388, 23:58 عصر
لیست پنجره های باز مساوی لیست Processهای در حال اجرا نیست. در تاپیک دیگه این مورد را توضیح دادم.
EnumWindowsProc فقط لیست پنجره های Top-Level رو برمیگردونه، و ربطی به لیست Processهای در حال اجرا نداره.
من توسط این کد لیست پنجره های باز رو گرفتم و توسط تابع PostMessage پیغام WM_Close رو بهشون فرستادم ، میخوام هیچ پنجره ای جز پنجره برنامه ی خودم باز نباشه ، ولی بعد از بستن پنحره ها پنجره Turn Off Computer رو باز میکنه ، دلیلش چیه ؟ مگه این پنجره جزو پنجره های Top-Level هست ؟

DAMAVAND
شنبه 25 مهر 1388, 01:15 صبح
بخاطر اينکه شما پيام WM_Close رو به پنجره Progman هم ميفرستيد.
قبل از فرستادن پيام , اول Classname پنجره رو چک کنيد اگه Progman نبود اون وقت پيام WM_Close رو براش بفرستيد .

Felony
شنبه 25 مهر 1388, 06:13 صبح
بخاطر اينکه شما پيام WM_Close رو به پنجره Progman هم ميفرستيد.
قبل از فرستادن پيام , اول Classname پنجره رو چک کنيد اگه Progman نبود اون وقت پيام WM_Close رو براش بفرستيد .

این کار رو کردم ، یعنی هر برنامه ای به جز برنامه ی خودم و برنامه ی Progra Manager رو بهش پیفام میفرستم ، مثل اینکه مشکل از ویندوز هست چون الان هم 2 تا کار بسیار عجیب کرد ...

Felony
شنبه 25 مهر 1388, 06:23 صبح
فهمیدم مشکل از کجاست ، علاوه بر برنامه ی Program Manager باید چک کرد که پیغام به برنامه ای بدون نام هم فرستاده نشه ، چون وقتی اون شرط آخری رو بر میداری پنجره Turn Off Computer نمایش داده میشه .


if (string(Title)<>'Form1') and (string(Title)<>'Program Manager') and (string(Title)<>'') then

Mahmood_M
شنبه 25 مهر 1388, 08:14 صبح
فهمیدم مشکل از کجاست ، علاوه بر برنامه ی Program Manager باید چک کرد که پیغام به برنامه ای بدون نام هم فرستاده نشه
به Title پنجره ی Program Manager نمی شه دسترسی داشت ، چون پنجره ای ازش نمایش داده نمیشه ! ، ولی نام کلاسش همونطور که دوستمون گفتن " progman " هست با دادن مقادیر زیر به FindWindow این برنامه پیدا میشه :

FindWindow('progman', nil);
نکته ی اصلی مقدار nil هست که در FindWindow قرار میگیره و باعث میشه که اصلا عنوان مد نظر قرار نگیره ...
با توجه به این که میخواید تمام پنجره ها بسته بشه به غیر از برنامه ی خودتون و Program manager ، بهتره به صورت زیر عمل کنید ( مثال ) :
var
PGHandle , MyHandle : THandle;
begin
PGHandle := FindWindow('progman', nil);
MyHandle := Application.MainForm.Handle;
if (H <> PGHandle) and (H <> MyHandle) then
PostMessage(H, WM_CLOSE, 0, 0);
end;
پنجره هایی هم هستند که عنوان ندارند اما باید بسته شوند ...

موفق باشید ...

Felony
شنبه 25 مهر 1388, 12:05 عصر
Title پنجره ی Program Manager نمی شه دسترسی داشت ، چون پنجره ای ازش نمایش داده نمیشه !
کد زیر رو به عنوان نمونه نوشتم تا ببینید میشه به Title اون دسترسی داشت ، تست کنید :

var
PGHandle , MyHandle : THandle;
Title: array[0..255] of char;
begin
PGHandle := FindWindow('progman', nil);
GetWindowText(PGHandle, Title, 255);
ShowMessage(Title);
end;