2015-10-27 4 views
2

У меня есть код здесь, но при нажатии кнопки некоторые экземпляры на самом деле не сводятся к минимуму или не восстанавливаются. Я попробовал все, что мог, но мне не повезло.Как свести к минимуму и восстановить процесс с большим количеством экземпляров?

Private Declare Function ShowWindow Lib "user32.dll" (_ 
ByVal hWnd As IntPtr, _ 
ByVal nCmdShow As Show_Window _ 
) As Boolean 

Private Enum Show_Window As Integer 
    Hide = 0 
    ShowNormal = 1 
    ShowMinimized = 2 
    ShowMaximized = 3 
    Maximize = 3 
    ShowNormalNoActivate = 4 
    Show = 5 
    Minimize = 6 
    ShowMinNoActivate = 7 
    ShowNoActivate = 8 
    Restore = 9 
    ShowDefault = 10 
    ForceMinimized = 11 
End Enum 

Private Sub MinimizeAllToolStripMenuItem_Click(sender As Object, e As EventArgs) Handles MinimizeAllToolStripMenuItem.Click 
    Dim p() As Process = Process.GetProcessesByName("GameServer") 
    Dim p1() As Process = Process.GetProcessesByName("AccountServer") 
    Dim p2() As Process = Process.GetProcessesByName("GateServer") 
    Dim p3() As Process = Process.GetProcessesByName("GroupServer") 
    Dim p4() As Process = Process.GetProcessesByName("TradeServer") 
    Dim p5() As Process = Process.GetProcessesByName("FilterServer") 
    If MinimizeAllToolStripMenuItem.Text = "Minimize All" Then 
     For Each pr As Process In p 
      ShowWindow(pr.MainWindowHandle, Show_Window.ForceMinimized) 
     Next pr 
     For Each pr As Process In p1 
      ShowWindow(pr.MainWindowHandle, Show_Window.ForceMinimized) 
     Next pr 
     For Each pr As Process In p2 
      ShowWindow(pr.MainWindowHandle, Show_Window.ForceMinimized) 
     Next pr 
     For Each pr As Process In p3 
      ShowWindow(pr.MainWindowHandle, Show_Window.ForceMinimized) 
     Next pr 
     For Each pr As Process In p4 
      ShowWindow(pr.MainWindowHandle, Show_Window.ForceMinimized) 
     Next pr 
     For Each pr As Process In p5 
      ShowWindow(pr.MainWindowHandle, Show_Window.ForceMinimized) 
     Next pr 
     MinimizeAllToolStripMenuItem.Text = "Restore All" 
    Else 
     For Each pr As Process In p 
      ShowWindow(pr.MainWindowHandle, Show_Window.Restore) 
     Next pr 
     For Each pr As Process In p1 
      ShowWindow(pr.MainWindowHandle, Show_Window.Restore) 
     Next pr 
     For Each pr As Process In p2 
      ShowWindow(pr.MainWindowHandle, Show_Window.Restore) 
     Next pr 
     For Each pr As Process In p3 
      ShowWindow(pr.MainWindowHandle, Show_Window.Restore) 
     Next pr 
     For Each pr As Process In p4 
      ShowWindow(pr.MainWindowHandle, Show_Window.Restore) 
     Next pr 
     For Each pr As Process In p5 
      ShowWindow(pr.MainWindowHandle, Show_Window.Restore) 
     Next pr 
     MinimizeAllToolStripMenuItem.Text = "Minimize All" 
    End If 
End Sub 

Что может быть неправильным? Или кто-то может поделиться вашим кодом о том, как свести к минимуму и восстановить процесс с большим количеством экземпляров. Я надеюсь, что кто-то может мне помочь.

+0

Вы можете включать некоторые подробности о том, что происходит не так? И возможно ли, чтобы вы опубликовали рабочий код, который будет компилироваться сам по себе? Это поможет нам диагностировать. – kdbanman

+0

Здравствуйте, @kdbanman, этот код работает и его компиляция без ошибок. Проблема в том, что всякий раз, когда я нажимаю эту кнопку, иногда какой-то экземпляр не сводится к минимуму, а иногда и не восстанавливается. – Foxseiz

ответ

2

На самом деле не знаю, где эта проблема может быть, но вы могли бы сократить код значительно используя что-то вроде этого:

Private Declare Function ShowWindow Lib "user32.dll" (
    ByVal hWnd As IntPtr, 
    ByVal nCmdShow As Show_Window 
    ) As Boolean 

Private Enum Show_Window As Integer 
    Hide = 0 
    ShowNormal = 1 
    ShowMinimized = 2 
    ShowMaximized = 3 
    Maximize = 3 
    ShowNormalNoActivate = 4 
    Show = 5 
    Minimize = 6 
    ShowMinNoActivate = 7 
    ShowNoActivate = 8 
    Restore = 9 
    ShowDefault = 10 
    ForceMinimized = 11 
End Enum 

Private Sub MinimizeAllToolStripMenuItem_Click(sender As Object, e As EventArgs) Handles MinimizeAllToolStripMenuItem.Click 
    Dim processes() As String = {"GameServer", "AccountServer", "GateServer", "GroupServer", "TradeServer", "FilterServer"} 
    Dim cmd As Show_Window = If(MinimizeAllToolStripMenuItem.Text = "Minimize All", Show_Window.Minimize, Show_Window.Restore) 
    For Each processName As String In processes 
     For Each pr As Process In Process.GetProcessesByName(processName) 
      ShowWindow(pr.MainWindowHandle, cmd) 
     Next 
    Next 
    MinimizeAllToolStripMenuItem.Text = If(MinimizeAllToolStripMenuItem.Text = "Restore All", "Minimize All", "Restore All") 
End Sub 
+0

Спасибо за оптимизацию, но я не так уверен, где могут быть программы. Просто для идеи я использовал ваш код, перед которым я использовал и этот код, который держит эти серверы. http://www.experts-exchange.com/questions/28736752/VB-net-Auto-Restart-Application.html – Foxseiz