كيفية استخدام Visual c + + لإغلاق تطبيق آخر

للحصول على إصدار Microsoft Visual Basic.NET من هذه المقالة، راجع
305602 .

للحصول على إصدار Microsoft Visual C#.NET من هذه المقالة، راجع
305603 .

في هذه المهمة


ملخص

توضح هذه المقالة كيفية إغلاق تطبيق آخر من داخل التطبيق الخاص بك. توضح هذه المقالة كيفية إغلاق مثيل معين من تطبيق آخر، مثل "المفكرة"، في حالة تشغيل أكثر من مثيل واحد من التطبيق.

العودة إلى أعلى

قم بتعريف المتغيرات

يجب عليك تعريف متغيرات متعددة. لأنه يتم استخدام هذه المتغيرات في أساليب متعددة، بتعريفها خارج أي إجراء حتى أن تظل في نطاق.

المتغير الأول عبارة عن صفيف الاحتفاظ بالكائنات عملية إرجاع الأسلوب جيتبروسيسبينامي . في هذه التعليمات البرمجية، "بروكنامي" هو متغير سلسلة يستخدم للاحتفاظ باسم العملية:
private:   Process *processes[];
static String *procName = S"Notepad";
العودة إلى أعلى

الحصول على قائمة بمثيلات التطبيق

يتم استدعاء التعليمات البرمجية التالية للدالة بويلدليست كل مرة يتم إنشاء مثيل جديد من برنامج "المفكرة". هذا المثال يقوم بتخزين معلومات العملية في عنصر تحكم ListView . التعليمات البرمجية لملء عنصر التحكم ListView يتم تضمين فقط من أجل الاتساق مع المثال الكامل التالي.

الجزء الأهم من هذا القانون هو استدعاء الأسلوب جيتبروسيسبينامي فئة العملية . هذا الأسلوب بإرجاع صفيف مؤشرات كائن العملية يمكن تكراره عن طريق استخدام تكرار حلقي ل .
ListViewItem *itemAdd ; ListView1->Items->Clear();
processes = Process::GetProcessesByName(procName);
for (int i = 0; i < processes->Length; i++)
{
itemAdd = ListView1->Items->Add(processes[i]->MainWindowTitle);
itemAdd->SubItems->Add(processes[i]->Id.ToString());
}
العودة إلى أعلى

إغلاق مثيل محدد للتطبيق

إذا كان لديك مثيلات متعددة من تطبيق قيد التشغيل، إذا كنت تريد إغلاق مثيل واحد، يجب أن تفرق بين هذه العمليات. يستخدم هذا المثال خاصية المعرف للتفريق بين العمليات. يتم تخزين معرف الخاصية والخاصيه مينويندووتيتلي في عنصر تحكم ListView .

هذه التعليمات البرمجية الحصول على العنصر المحدد حاليا في عنصر تحكم ListView وتحصل على إشارة إلى العملية باستخدام أسلوب جيتبروسيسبييد فئة العملية ثم إغلاق تلك العملية عن طريق استدعاء الأسلوب كلوسيمينويندوو . ملاحظة لا يمكن إعادة القائمة قبل إنهاء العملية تماما لأن الأسلوب ويتفوريكسيت الفئة عملية تمنع ذلك.
try{         
ListViewItem *lvi = ListView1->SelectedItems->get_Item(0);
ListViewItem::ListViewSubItem *lvsi = lvi->SubItems->get_Item(1);
int procID = System::Convert::ToInt32(lvsi->Text);
Process *tempProc=Process::GetProcessById(procID);
tempProc->CloseMainWindow();
tempProc->WaitForExit();
BuildList();
}
catch(...)
{
MessageBox::Show(S"Select a process in the ListView.");
}

العودة إلى أعلى

أغلق كافة مثيلات التطبيق

لإغلاق كافة مثيلات تطبيق معين، تقود الصفيف إرجاع الأسلوب جيتبروسيسبينامي ومن ثم استدعاء الأسلوب كلوسيمينويندوو على كل كائن العملية.
try{
for (int i = 0; i < processes->Length; i++)
{
processes[i]->CloseMainWindow();
}

ListView1->Items->Clear();
}
catch (System::NullReferenceException *)
{
MessageBox::Show("No instances of Notepad running.");
}

العودة إلى أعلى

مثال خطوة بخطوة

  1. إنشاء "تطبيق c + + مدارة" جديدة في Microsoft Visual Studio.NET أو Microsoft Visual Studio 2005. للقيام بذلك، اتبع الخطوات التالية:
    1. يبدأ Visual Studio.NET أو Visual Studio 2005.
    2. في القائمة ملف ، أشر إلى
      جديد، ثم انقر فوق المشروع.
    3. في مربع الحوار مشروع جديد ، انقر فوق
      مشاريع visual c + + ضمن أنواع المشروع، ثم انقر فوق تطبيق c + + مدارة لبرنامج Visual Studio.NET 2002، انقر فوق تطبيق وحدة التحكم (.NET) الخاصة ب Visual Studio.NET 2003 أو انقر فوق تطبيق وحدة التحكم CLR ل Visual Studio 2005 ضمن
      قوالب.
    4. اكتب اسماً في المربع الاسم .
  2. في "مستكشف الحلول"، افتح ملف.cpp المشروع.
  3. استبدال التعليمات البرمجية الموجودة في إطار التعليمات البرمجية بما يلي:
    #include "stdafx.h"#include <windows.h>
    #ifdef MessageBox
    #undef MessageBox
    #endif

    #using <mscorlib.dll>
    #using "System.Dll"
    #using "System.Windows.Forms.Dll"
    #using "System.Drawing.Dll"

    using namespace System;
    using namespace System::Drawing;
    using namespace System::Collections;
    using namespace System::ComponentModel;
    using namespace System::Windows::Forms;
    using namespace System::Diagnostics;

    namespace CloseApplication_mc
    {
    public __gc class Form1 : public Form
    {
    protected:
    Button *btnCloseAll;
    ColumnHeader *ColumnHeader2;
    ColumnHeader *ColumnHeader1;
    Button *btnLaunch1;
    ListView *ListView1;
    Button *btnClose1;

    private:
    Process *processes[];
    static String *procName = S"Notepad";
    static String *specialFolder = Environment::GetFolderPath(Environment::SpecialFolder::System);

    public:
    Form1()
    {
    InitForm();
    }

    protected:
    void Dispose( bool disposing )
    {
    Form::Dispose(disposing);
    }

    private:
    void InitForm()
    {
    btnClose1 = new Button();
    ColumnHeader2 = new ColumnHeader();
    ColumnHeader1 = new ColumnHeader();
    btnCloseAll = new Button();
    btnLaunch1 = new Button();
    ListView1 = new ListView();
    SuspendLayout();

    //
    // btnClose1
    //
    btnClose1->Location = Point(160, 176);
    btnClose1->Name = S"btnClose1";
    btnClose1->Size = System::Drawing::Size(112, 32);
    btnClose1->TabIndex = 4;
    btnClose1->Text = S"Close Selected Process";
    btnClose1->Click += new System::EventHandler(this, btnClose1_Click);
    Controls->Add(btnClose1);

    //
    // btnCloseAll
    //
    btnCloseAll->Location = Point(160, 216);
    btnCloseAll->Name = S"btnCloseAll";
    btnCloseAll->Size = System::Drawing::Size(112, 32);
    btnCloseAll->TabIndex = 3;
    btnCloseAll->Text = S"Close All Processes";
    btnCloseAll->Click += new System::EventHandler(this, btnCloseAll_Click);
    Controls->Add(btnCloseAll);

    //
    // btnLaunch1
    //
    btnLaunch1->Location = Point(32, 176);
    btnLaunch1->Name = S"btnLaunch1";
    btnLaunch1->Size = System::Drawing::Size(112, 72);
    btnLaunch1->TabIndex = 1;
    btnLaunch1->Text = S"Start Notepad";
    btnLaunch1->Click += new System::EventHandler(this, btnLaunch1_Click);
    Controls->Add(btnLaunch1);

    //
    // ColumnHeader2
    //
    ColumnHeader2->Text = S"Process ID";
    ColumnHeader2->Width = 85;

    //
    // ColumnHeader1
    //
    ColumnHeader1->Text = S"Window Title";
    ColumnHeader1->Width = 160;

    //
    // ListView1
    //
    ListView1->Columns->Add(ColumnHeader1);
    ListView1->Columns->Add(ColumnHeader2);
    ListView1->Location = Point(22, 8);
    ListView1->MultiSelect = false;
    ListView1->Name = S"ListView1";
    ListView1->Size = System::Drawing::Size(250, 152);
    ListView1->TabIndex = 7;
    ListView1->View = View::Details;
    Controls->Add(ListView1);

    //
    // Form1
    //
    AutoScaleBaseSize = System::Drawing::Size(5, 13);
    ClientSize = System::Drawing::Size(292, 266);
    Name = S"Form1";
    Text = S"Process Example";
    Closing += new System::ComponentModel::CancelEventHandler(this, closing);
    Load += new System::EventHandler(this, Form1_Load);
    ResumeLayout(false);
    }

    void BuildList()
    {
    ListViewItem *itemAdd ;
    ListView1->Items->Clear();
    processes = Process::GetProcessesByName(procName);
    for (int i = 0; i < processes->Length; i++)
    {
    itemAdd = ListView1->Items->Add(processes[i]->MainWindowTitle);
    itemAdd->SubItems->Add(processes[i]->Id.ToString());
    }
    }

    void btnLaunch1_Click(Object *sender, EventArgs *e)
    {
    ProcessStartInfo *p = new ProcessStartInfo();
    p->FileName = String::Concat(specialFolder, S"\\eula.txt");
    p->WindowStyle = ProcessWindowStyle::Minimized ;
    Process *proc = Process::Start(p);
    proc->WaitForInputIdle();
    BuildList();
    }

    void Form1_Load(Object *sender, EventArgs *e)
    {
    }

    void btnClose1_Click(Object *sender, EventArgs *e)
    {
    try
    {
    ListViewItem *lvi = ListView1->SelectedItems->get_Item(0);
    ListViewItem::ListViewSubItem *lvsi = lvi->SubItems->get_Item(1);
    int procID = System::Convert::ToInt32(lvsi->Text);
    Process *tempProc=Process::GetProcessById(procID);
    tempProc->CloseMainWindow();
    tempProc->WaitForExit();
    BuildList();
    }
    catch(...)
    {
    MessageBox::Show(S"Select a process in the ListView before clicking this button.");
    }
    }

    void btnCloseAll_Click(Object *sender, EventArgs *e)
    {
    if (processes != 0)
    {
    for (int i = 0; i < processes->Length; i++)
    {
    processes[i]->CloseMainWindow();
    }

    ListView1->Items->Clear();
    }
    }

    void closing(Object *sender, System::ComponentModel::CancelEventArgs *e)
    {
    btnCloseAll_Click(this,e);
    }
    };
    }

    using namespace CloseApplication_mc;

    int APIENTRY WinMain(HINSTANCE hInstance,
    HINSTANCE hPrevInstance,
    LPTSTR lpCmdLine,
    int nCmdShow)
    {
    Form1 *FormInstance = new Form1;
    Application::Run(FormInstance);

    return 0;
    }

  4. إنشاء وتشغيل التطبيق.
  5. انقر فوق بدء تشغيل برنامج "المفكرة" مرة واحدة أو أكثر.
  6. انقر فوق مثيل لبرنامج "المفكرة" في
    عرض القائمة مربع ومن ثم انقر فوق إغلاق العملية. يؤدي هذا إلى إغلاق المثيل المحدد لبرنامج "المفكرة" الذي قمت بتحديده. يمكنك أيضا النقر فوق إغلاق كافة العمليات لإغلاق كافة مثيلات برنامج "المفكرة" التي تقوم بتشغيل.
ملاحظة: تستخدم هذه المقالة خاصية المعرف فئة العملية للتمييز بين مثيلات التطبيق. خاصية معرف أمر جيد لهذه المهمة لأن تكون عملية كافة معرفات فريدة. يمكنك استخدام الخاصية ويندووهاندلي لكائن العملية للحصول على نفس النتائج. على الرغم من أنه يمكنك استخدام الخصائص الأخرى، فأقل ملاءمة لهذه المهمة. إذا لم تكن تعرف معرف العملية، أو إذا كان لديك معالج الإطار الرئيسي، يمكنك أيضا استخدام الخاصية مينويندووتيتلي للمساعدة في تحديد المثيل الصحيح. ومع ذلك، لأنه قد لا تكون الخاصية مينويندووتيتلي الفريد، لا تضمن يتم الإشارة إلى الإطار الصحيح.

العودة إلى أعلى

المراجع

لمزيد من المعلومات، راجع صفحة "العملية فئة" على موقع شبكة مطوري Microsoft (MSDN) التالي على الويب:
العودة إلى أعلى
خصائص

رقم الموضوع: 307395 - آخر مراجعة: 09‏/01‏/2017 - المراجعة: 1

تعليقات