سوال : بدست آوردن ليست پروسه هاي در حال اجرا ؟
مدتي است كه به دنبال كدي مي گردم كه بتواند ليستي از پروسه هاي در حال اجرا تهيه كند. بايد بگويم كه اين كار را با استفاده از كد زير انجام داده ام ولي مشكل اين جا است كه نميتوانم مسير اين فايلها را بدست آورم.(به عنوان مثال 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 اضافه كنيد.
نقل قول: سوال : بدست آوردن ليست پروسه هاي در حال اجرا ؟
از اين استفاده كن، فكر كنم اون كاري كه مي خواي بكنه . تست نكردم.
http://vcldeveloper.com/downloads/ProcessInfo.zip
نقل قول: سوال : بدست آوردن ليست پروسه هاي در حال اجرا ؟
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;
نقل قول: سوال : بدست آوردن ليست پروسه هاي در حال اجرا ؟
نقل قول:
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/h...-tprocessinfo/
برای اینکه ببینید چطور مسیر فایل EXE رو بدست میاره، می تونید سورس آن را مطالعه کنید.
نقل قول: سوال : بدست آوردن ليست پروسه هاي در حال اجرا ؟
نقل قول:
لیست پنجره های باز مساوی لیست Processهای در حال اجرا نیست. در تاپیک دیگه این مورد را توضیح دادم.
EnumWindowsProc فقط لیست پنجره های Top-Level رو برمیگردونه، و ربطی به لیست Processهای در حال اجرا نداره.
من توسط این کد لیست پنجره های باز رو گرفتم و توسط تابع PostMessage پیغام WM_Close رو بهشون فرستادم ، میخوام هیچ پنجره ای جز پنجره برنامه ی خودم باز نباشه ، ولی بعد از بستن پنحره ها پنجره Turn Off Computer رو باز میکنه ، دلیلش چیه ؟ مگه این پنجره جزو پنجره های Top-Level هست ؟
نقل قول: سوال : بدست آوردن ليست پروسه هاي در حال اجرا ؟
بخاطر اينکه شما پيام WM_Close رو به پنجره Progman هم ميفرستيد.
قبل از فرستادن پيام , اول Classname پنجره رو چک کنيد اگه Progman نبود اون وقت پيام WM_Close رو براش بفرستيد .
نقل قول: سوال : بدست آوردن ليست پروسه هاي در حال اجرا ؟
نقل قول:
نوشته شده توسط
DAMAVAND
بخاطر اينکه شما پيام WM_Close رو به پنجره Progman هم ميفرستيد.
قبل از فرستادن پيام , اول Classname پنجره رو چک کنيد اگه Progman نبود اون وقت پيام WM_Close رو براش بفرستيد .
این کار رو کردم ، یعنی هر برنامه ای به جز برنامه ی خودم و برنامه ی Progra Manager رو بهش پیفام میفرستم ، مثل اینکه مشکل از ویندوز هست چون الان هم 2 تا کار بسیار عجیب کرد ...
نقل قول: سوال : بدست آوردن ليست پروسه هاي در حال اجرا ؟
فهمیدم مشکل از کجاست ، علاوه بر برنامه ی Program Manager باید چک کرد که پیغام به برنامه ای بدون نام هم فرستاده نشه ، چون وقتی اون شرط آخری رو بر میداری پنجره Turn Off Computer نمایش داده میشه .
if (string(Title)<>'Form1') and (string(Title)<>'Program Manager') and (string(Title)<>'') then
نقل قول: سوال : بدست آوردن ليست پروسه هاي در حال اجرا ؟
نقل قول:
فهمیدم مشکل از کجاست ، علاوه بر برنامه ی 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;
پنجره هایی هم هستند که عنوان ندارند اما باید بسته شوند ...
موفق باشید ...
نقل قول: سوال : بدست آوردن ليست پروسه هاي در حال اجرا ؟
نقل قول:
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;