VB.Net Process.CloseMainWindow和Process.Close无法正常工作

时间:2015-11-21 22:42:46

标签: vb.net

我已经使用后台工作程序启动应用程序,等待取消,然后关闭应用程序。但由于某种原因,应用程序永远不会关闭我已经尝试过使用和不使用notificationPreview.WaitForExit()

Private Sub bgWorker_DoWork(sender As Object, e As System.ComponentModel.DoWorkEventArgs) Handles bgWorker.DoWork

    'Extract the executable to the applications directory path and execute it
    Dim notificationPreview As New Process
    Dim monitorExe As Byte() = My.Resources.ITSupportMonitoring
    My.Computer.FileSystem.WriteAllBytes(My.Application.Info.DirectoryPath & "ITSupportMonitoring.exe", monitorExe, False)
    notificationPreview = Process.Start(My.Application.Info.DirectoryPath & "ITSupportMonitoring.exe")
    notificationPreview.WaitForInputIdle()

    'Wait until the worker is sent a cancellation request
    Do Until bgWorker.CancellationPending = True
        System.Threading.Thread.Sleep(500)
    Loop

    'If the process hasn't been closed by the user close it
    If Not notificationPreview.HasExited Then 'If the process is still running
        notificationPreview.CloseMainWindow() 'Tell the main window of the notification process to close
        notificationPreview.WaitForExit()
        notificationPreview.Close() 'Free all resources used by the notification process
    End If

    My.Computer.FileSystem.DeleteFile(My.Application.Info.DirectoryPath & "ITSupportMonitoring.exe") 'Delete the executable file

    e.Cancel = True

End Sub

以下是无法关闭的流程的完整代码:

Public Class frmMonitoring

Dim noticeText As String

Private Sub frmMonitoring_Load(sender As Object, e As EventArgs) Handles Me.Load
    'Set the notice text
    If My.Application.CommandLineArgs.Count > 0 Then
        noticeText = My.Application.CommandLineArgs(0)
    Else
        noticeText = "Example String"
    End If

    Me.ForeColor = Color.Black

    tmrFlash.Interval = 1000
    tmrFlash.Start()
    Me.Top = 0
    Me.Left = 0
    Me.TopMost = True
End Sub

Private Sub tmrFlash_Tick(sender As Object, e As EventArgs) Handles tmrFlash.Tick

    If Me.ForeColor = Color.Black Then
        Me.ForeColor = Color.Red
    Else
        Me.ForeColor = Color.Black
    End If

End Sub

Protected Overrides Sub OnPaint(e As PaintEventArgs)
    MyBase.OnPaint(e)

    Dim drawFont As New System.Drawing.Font(SystemFonts.DefaultFont.Name, 16)
    Dim drawBrush As New System.Drawing.SolidBrush(Me.ForeColor)
    Dim drawFormat As New System.Drawing.StringFormat

    Dim drawRect As New RectangleF(e.ClipRectangle.Location, e.ClipRectangle.Size)
    drawRect.Height = drawRect.Height * 0.65 'The bottom line of text was getting partially clipped, so reduced the height of the drawing area to 65%

    drawFont = GetAdjustedFont(e.Graphics, noticeText, drawFont, drawRect, 40, 4, True)

    Dim stringFormat As New StringFormat(StringFormatFlags.NoClip)
    stringFormat.Alignment = StringAlignment.Center
    stringFormat.LineAlignment = StringAlignment.Center

    e.Graphics.DrawString(noticeText, drawFont, drawBrush, RectangleF.op_Implicit(ClientRectangle), stringFormat)

    drawFont.Dispose()
    drawBrush.Dispose()

End Sub

Public Function GetAdjustedFont(ByRef GraphicRef As Graphics, ByVal GraphicString As String, ByVal OriginalFont As Font, ByVal ContainerSize As RectangleF, ByVal MaxFontSize As Integer, ByVal MinFontSize As Integer, ByVal SmallestOnFail As Boolean) As Font

    'Loop through font sizes and MeasureString to find the largest font which can be used         
    For AdjustedSize As Integer = MaxFontSize To MinFontSize Step -1

        Dim TestFont = New Font(OriginalFont.Name, AdjustedSize, OriginalFont.Style)
        Dim charsFitted As Integer
        Dim linesFilled As Integer

        ' Test the string with the new size
        Dim AdjustedSizeNew = GraphicRef.MeasureString(GraphicString, TestFont, ContainerSize.Size, New StringFormat, charsFitted, linesFilled)

        If charsFitted = GraphicString.Length Then 'If every characted in the string was printed
            'Good font, return it
            Return TestFont 'New Font(TestFont.Name, TestFont.Size - 1, TestFont.Style)
        End If

    Next

    ' If you get here there was no fontsize that worked
    ' return MinimumSize or Original?
    If SmallestOnFail Then
        Return New Font(OriginalFont.Name, MinFontSize, OriginalFont.Style)
    Else
        Return OriginalFont
    End If
End Function

End Class

0 个答案:

没有答案