نمایش نتایج 1 تا 10 از 10

نام تاپیک: سوال : بدست آوردن ليست پروسه هاي در حال اجرا ؟

  1. #1

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

    مدتي است كه به دنبال كدي مي گردم كه بتواند ليستي از پروسه هاي در حال اجرا تهيه كند. بايد بگويم كه اين كار را با استفاده از كد زير انجام داده ام ولي مشكل اين جا است كه نميتوانم مسير اين فايلها را بدست آورم.(به عنوان مثال 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 اضافه كنيد.

  2. #2
    کاربر دائمی آواتار merced
    تاریخ عضویت
    اردیبهشت 1383
    محل زندگی
    خراسان جنوبي
    پست
    562

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

    از اين استفاده كن، فكر كنم اون كاري كه مي خواي بكنه . تست نكردم.
    http://vcldeveloper.com/downloads/ProcessInfo.zip

  3. #3
    کاربر دائمی آواتار Tasnim
    تاریخ عضویت
    خرداد 1385
    محل زندگی
    تمام ایران سرای من است
    پست
    274

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

    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;

  4. #4

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

    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 رو بدست میاره، می تونید سورس آن را مطالعه کنید.


    وَ سَيَعْلَمُ الَّذِينَ ظَلَمُوا [آل محمد حقهم] أَيَّ مُنْقَلَبٍ يَنْقَلِبُونَ - الشعراء (227)
    و ظالمین [حق آل محمد (ص) ] به زودی خواهند دانست که به کدام بازگشتگاه بازخواهند گشت.

  5. #5

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

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

  6. #6
    کاربر دائمی آواتار DAMAVAND
    تاریخ عضویت
    اسفند 1384
    محل زندگی
    همين اطراف
    پست
    373

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

    بخاطر اينکه شما پيام WM_Close رو به پنجره Progman هم ميفرستيد.
    قبل از فرستادن پيام , اول Classname پنجره رو چک کنيد اگه Progman نبود اون وقت پيام WM_Close رو براش بفرستيد .

  7. #7

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

    نقل قول نوشته شده توسط DAMAVAND مشاهده تاپیک
    بخاطر اينکه شما پيام WM_Close رو به پنجره Progman هم ميفرستيد.
    قبل از فرستادن پيام , اول Classname پنجره رو چک کنيد اگه Progman نبود اون وقت پيام WM_Close رو براش بفرستيد .
    این کار رو کردم ، یعنی هر برنامه ای به جز برنامه ی خودم و برنامه ی Progra Manager رو بهش پیفام میفرستم ، مثل اینکه مشکل از ویندوز هست چون الان هم 2 تا کار بسیار عجیب کرد ...

  8. #8

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

    فهمیدم مشکل از کجاست ، علاوه بر برنامه ی Program Manager باید چک کرد که پیغام به برنامه ای بدون نام هم فرستاده نشه ، چون وقتی اون شرط آخری رو بر میداری پنجره Turn Off Computer نمایش داده میشه .

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

  9. #9

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

    فهمیدم مشکل از کجاست ، علاوه بر برنامه ی 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;

    پنجره هایی هم هستند که عنوان ندارند اما باید بسته شوند ...

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

  10. #10

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

    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;

برچسب های این تاپیک

قوانین ایجاد تاپیک در تالار

  • شما نمی توانید تاپیک جدید ایجاد کنید
  • شما نمی توانید به تاپیک ها پاسخ دهید
  • شما نمی توانید ضمیمه ارسال کنید
  • شما نمی توانید پاسخ هایتان را ویرایش کنید
  •