كيفية استخدام Visual Basic.NET أو Visual Basic 2005 لإغلاق تطبيق آخر

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


في هذه المهمة


ملخص

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

مناقشة منطق البرمجة

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

متغيرات عديدة تحتاج إلى تعريف. لأنه يتم استخدام هذه المتغيرات في أساليب متعددة، يجب أن توضع خارج أي إجراء حيث أن تظل في نطاق. متغير الإجراء يحتوي مرجع إلى كائن عملية فردية، وهي عمليات صفيف الذي يحتفظ المعالجة الكائنات التي يتم إرجاعها بواسطة الأسلوب جيتبروسيسبينامي :
Private proc As ProcessPrivate processes() As Process
Private procName As String = "notepad"

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

تشمل التعليمات البرمجية التالية دالة (تسمى بويلدليست في النموذج) يسمى كل مرة يتم إنشاء مثيل جديد من برنامج "المفكرة". يقوم هذا النموذج بتخزين معلومات العملية في عنصر تحكم ListView ؛ التعليمات البرمجية لملء عنصر التحكم ListView يتم تضمين فقط من أجل التوافق مع عينة كاملة. الجزء الأهم من هذا القانون هو استدعاء الأسلوب جيتبروسيسبينامي فئة العملية . هذا الأسلوب بإرجاع صفيف كائنات العملية ، يمكن تكراره عن طريق استخدام ل... كل كتلة، كما يلي:
Dim itemAdd As ListViewItemListView1.Items.Clear()

processes = Process.GetProcessesByName(procName)

For Each proc In processes
itemAdd = ListView1.Items.Add(proc.MainWindowTitle)
itemAdd.SubItems.Add(proc.Id.ToString)
Next

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

عندما تقوم بتشغيل مثيلات متعددة للتطبيق، وتريد إغلاق مثيل واحد، يجب أن تفرق بين هذه العمليات. يستخدم النموذج التالي خاصية معرف كائن العملية لمعرفة العمليات عن بعضها البعض. يتم تخزين معرف الخاصية والخاصيه مينويندووتيتلي (خاصية أخرى لكائن العملية ) في عنصر تحكم ListView . يحصل التعليمات البرمجية على العنصر المحدد حاليا في عنصر تحكم ListView ويحصل على إشارة إلى العملية باستخدام أسلوب جيتبروسيسبييد لدرجة عملية إغلاق تلك العملية عن طريق استدعاء الأسلوب كلوسيمينويندوو ، كما يلي:
Try    Dim procID As Integer = _  
System.Convert.ToInt32(ListView1.SelectedItems(0).SubItems(1).Text)
Dim tempProc As Process = Process.GetProcessById(procID)
tempProc.CloseMainWindow()
tempProc.WaitForExit()
buildList()
Catch
MessageBox.Show("Please select a process in the ListView before clicking this button." + _
" Or the Process may have been closed by somebody.")
buildList()
End Try

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

إغلاق كافة مثيلات تطبيق معين يعتبر أمرا بسيطاً نسبيا. يمكن أن تقود الصفيف التي تم إرجاعها بواسطة الأسلوب جيتبروسيسبينامي ثم استدعاء الأسلوب كلوسيماينويندوو على كل كائن العملية، كما يلي:
Try  For Each proc In processes
proc.CloseMainWindow()
proc.WaitForExit()
Next
buildList()
Catch ex As System.NullReferenceException
MessageBox.Show("No instances of Notepad running.")
End Try

خطوات لإنشاء نموذج

  1. تشغيل تطبيق Visual Basic Windows جديد في Visual Studio.NET أو في Visual Studio 2005.
  2. انقر نقراً مزدوجاً فوق النموذج الافتراضي Form1.vb، ثم حدد عرض التعليمات البرمجية.
  3. استبدال التعليمات البرمجية في إطار "التعليمات البرمجية" بما يلي:
    Option Strict OnOption Explicit On 

    Public Class Form1
    Inherits System.Windows.Forms.Form

    #Region " Windows Form Designer generated code "

    Public Sub New()
    MyBase.New()

    'This call is required by the Windows Form Designer.
    InitializeComponent()

    'Add any initialization after the InitializeComponent() call.

    End Sub

    'Form overrides dispose to clean up the component list.
    Protected Overloads Overrides Sub Dispose(ByVal disposing As Boolean)
    If disposing Then
    If Not (components Is Nothing) Then
    components.Dispose()
    End If
    End If
    MyBase.Dispose(disposing)
    End Sub
    Friend WithEvents btnLaunch1 As System.Windows.Forms.Button
    Friend WithEvents ColumnHeader1 As System.Windows.Forms.ColumnHeader
    Friend WithEvents ColumnHeader2 As System.Windows.Forms.ColumnHeader
    Friend WithEvents ListView1 As System.Windows.Forms.ListView
    Friend WithEvents btnCloseAll As System.Windows.Forms.Button
    Friend WithEvents btnClose1 As System.Windows.Forms.Button

    'Required by the Windows Form Designer.
    Private components As System.ComponentModel.Container

    'NOTE: The following procedure is required by the Windows Form Designer
    'It can be modified by using the Windows Form Designer.
    'Do not modify it by using the code editor.
    <System.Diagnostics.DebuggerStepThrough()> Private Sub InitializeComponent()
    Me.btnClose1 = New System.Windows.Forms.Button()
    Me.ListView1 = New System.Windows.Forms.ListView()
    Me.ColumnHeader1 = New System.Windows.Forms.ColumnHeader()
    Me.ColumnHeader2 = New System.Windows.Forms.ColumnHeader()
    Me.btnCloseAll = New System.Windows.Forms.Button()
    Me.btnLaunch1 = New System.Windows.Forms.Button()
    Me.SuspendLayout()
    '
    'btnClose1
    '
    Me.btnClose1.Location = New System.Drawing.Point(160, 176)
    Me.btnClose1.Name = "btnClose1"
    Me.btnClose1.Size = New System.Drawing.Size(112, 32)
    Me.btnClose1.TabIndex = 4
    Me.btnClose1.Text = "Close Selected Process"
    '
    'ListView1
    '
    Me.ListView1.Columns.AddRange(New System.Windows.Forms.ColumnHeader() {Me.ColumnHeader1, Me.ColumnHeader2})
    Me.ListView1.Location = New System.Drawing.Point(22, 8)
    Me.ListView1.MultiSelect = False
    Me.ListView1.Name = "ListView1"
    Me.ListView1.Size = New System.Drawing.Size(250, 152)
    Me.ListView1.TabIndex = 7
    Me.ListView1.View = System.Windows.Forms.View.Details
    '
    'ColumnHeader1
    '
    Me.ColumnHeader1.Text = "Window Title"
    Me.ColumnHeader1.Width = 160
    '
    'ColumnHeader2
    '
    Me.ColumnHeader2.Text = "Process ID"
    Me.ColumnHeader2.Width = 85
    '
    'btnCloseAll
    '
    Me.btnCloseAll.Location = New System.Drawing.Point(160, 216)
    Me.btnCloseAll.Name = "btnCloseAll"
    Me.btnCloseAll.Size = New System.Drawing.Size(112, 32)
    Me.btnCloseAll.TabIndex = 3
    Me.btnCloseAll.Text = "Close All Processes"
    '
    'btnLaunch1
    '
    Me.btnLaunch1.Location = New System.Drawing.Point(32, 176)
    Me.btnLaunch1.Name = "btnLaunch1"
    Me.btnLaunch1.Size = New System.Drawing.Size(112, 72)
    Me.btnLaunch1.TabIndex = 1
    Me.btnLaunch1.Text = "Start Notepad"
    '
    'Form1
    '
    Me.AutoScaleBaseSize = New System.Drawing.Size(5, 13)
    Me.ClientSize = New System.Drawing.Size(292, 266)
    Me.Controls.AddRange(New System.Windows.Forms.Control() {Me.ListView1, Me.btnClose1, Me.btnCloseAll, Me.btnLaunch1})
    Me.Name = "Form1"
    Me.Text = "Process Example"
    Me.ResumeLayout(False)

    End Sub

    #End Region

    Private procName As String = "notepad"
    Private proc As Process
    Private processes() As Process
    Private specialFolder As String = System.Environment.GetFolderPath(Environment.SpecialFolder.System)

    Private Sub buildList()
    'this sub populates the listview control with the instances of 'procName'
    'that are currently running.
    Dim itemAdd As ListViewItem
    ListView1.Items.Clear()

    processes = Process.GetProcessesByName(procName)

    For Each proc In processes
    itemAdd = ListView1.Items.Add(proc.MainWindowTitle)
    itemAdd.SubItems.Add(proc.Id.ToString)
    Next

    End Sub


    Private Sub btnLaunch1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnLaunch1.Click
    'Launch notepad and open the end user license agreement.
    Dim pInfo As New ProcessStartInfo()
    pInfo.FileName = specialFolder & "\eula.txt"
    pInfo.WindowStyle = ProcessWindowStyle.Minimized
    Dim p As Process = Process.Start(pInfo)
    p.WaitForInputIdle()
    buildList()
    End Sub


    Private Sub btnClose1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnClose1.Click
    'Close one of the instances of notepad based on the selected item in the ListView.
    'There are several ways to identify a process. For example,
    'you can use the mainwindowtitle, windowhandle, or processname, depending
    'on your needs. The process ID is used here because there may be several
    'windows open with the same title.
    Try
    Dim procID As Integer = System.Convert.ToInt32(ListView1.SelectedItems(0).SubItems(1).Text)
    Dim tempProc As Process = Process.GetProcessById(procID)
    tempProc.CloseMainWindow()
    tempProc.WaitForExit()
    buildList()
    Catch
    MessageBox.Show("Please select a process in the ListView before clicking this button." + _
    " Or the Process may have been closed by somebody.")
    buildList()
    End Try
    End Sub

    Private Sub btnCloseAll_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnCloseAll.Click
    'Walk the process array and close all processes.
    Try
    For Each proc In processes
    proc.CloseMainWindow()
    proc.WaitForExit()
    Next
    buildList()
    Catch ex As System.NullReferenceException
    MessageBox.Show("No instances of Notepad running.")
    End Try
    End Sub

    Private Sub Form1_Closing(ByVal sender As Object, ByVal e As System.ComponentModel.CancelEventArgs) Handles MyBase.Closing
    'Make sure that you do not leave any instances running.
    If Not (processes Is Nothing) Then
    If (processes.Length <> 0) Then
    Me.btnCloseAll_Click(Me, e)
    End If
    End If
    End Sub

    End Class

    ملاحظة: يجب تغيير التعليمات البرمجية في Visual Basic 2005. بشكل افتراضي، Visual Basic إنشاء ملفين للمشروع عند إنشاء مشروع Windows Forms. إذا تم تسمية النموذج Form1، الملفين تمثل النموذج تسمية Form1.vb و Form1.Designer.vb. كتابة التعليمات البرمجية في الملف Form1.vb. مصمم نماذج Windows بكتابة التعليمات البرمجية في ملف Form1.Designer.vb. مصمم نماذج Windows يستخدم الكلمة الأساسية الجزئية لتقسيم تطبيق Form1 إلى ملفين مستقلين. يمنع هذا السلوك التعليمة البرمجية التي تم إنشاؤها من قبل مصمم يتم interspersed مع التعليمات البرمجية الخاصة بك.

    لمزيد من المعلومات حول التحسينات لغة Visual Basic 2005 جديد، قم بزيارة موقع شبكة مطوري Microsoft (MSDN) التالي على الويب:لمزيد من المعلومات حول فئات جزئية ومصمم نماذج Windows، قم بزيارة موقع Msdn التالي:ملاحظة: من المستحسن أن طي المنطقة الذي يسمى مصمم النموذج Windows إنشاء التعليمات البرمجية.
  4. قم بتشغيل التطبيق.
  5. انقر فوق بدء تشغيل برنامج "المفكرة" مرة واحدة أو أكثر.
  6. انقر فوق مثيل لبرنامج "المفكرة" في إطار عنصر التحكم ListView وحدد عملية الإغلاق. يؤدي هذا إلى إغلاق المثيل المحدد لبرنامج "المفكرة" الذي قمت بتحديده. يمكنك أيضا تحديد إغلاق كافة العمليات لإغلاق كافة المثيلات قيد التشغيل من برنامج "المفكرة".

ملاحظات

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


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

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

المراجع

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

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

تعليقات