快速显示/隐藏WinForms GUI C#的方法

我正在创建一个有线程的应用程序。 我将GUI(Announce:Form)作为单独的线程启动。

那个窗口非常简约,只有一个输入框和一个按钮。 在另一个线程上将运行Tcp客户端,当它从TcpServer获取信息时,它应该传递它进入该输入框并显示gui(和最顶层的窗口)。 几秒钟之后,gui应该隐藏自己并等待另一个tcp msg,依此类推。

public void setTextBox(string varText) { if (InvokeRequired) { textBox.BeginInvoke(new textBoxCallBack(setTextBox), new object[] {varText}); } else { textBox.Text = varText; } } 

此代码用于从Tcp线程填充textBox。 现在唯一的问题是让窗口显示并正确隐藏。 一直在尝试许多解决方案,总是出现问题。 喜欢:

  private void windowStateChange(string varState) { if (InvokeRequired) { Invoke(new WindowStateChangeCallBack(windowStateChange), new object[] {varState}); } else { if (varState == "Hide") { //Hide(); // TopMost = false; //TopMost = varState != FormWindowState.Minimized; } else { //Show(); //MessageBox.Show("TEST1"); } } } public void windowStateChangeDiffrent(FormWindowState varState) { if (InvokeRequired) { Invoke(new WindowStateChangeCallBack(windowStateChange), new object[] {varState}); } else { WindowState = varState; // Hide(); TopMost = varState != FormWindowState.Minimized; } } 

什么是最好的方法来做到这一点(并且最快,随着时间的重要)?

答案1似乎有效:

  private static void windowStateChange(string varState) { if (mainAnnounceWindow.InvokeRequired) { mainAnnounceWindow.BeginInvoke(new StateCallBack(windowStateChange), new object[] {varState}); } else { if (varState == "Hide") { mainAnnounceWindow.Hide(); mainAnnounceWindow.TopMost = false; } else { mainAnnounceWindow.Show(); mainAnnounceWindow.TopMost = true; } } } 

有什么不好的吗?

使表单隐藏表单。隐藏form.Hide()应该没有问题。

但是我经历过再次表单显示并不总是有效。 所以如果你遇到同样的问题,你可以使用这样的东西:

 string RunningProcess = Process.GetCurrentProcess().ProcessName; Process[] processes = Process.GetProcessesByName(RunningProcess); int SW_SHOW = 5, SW_HIDE = 0, SW_RESTORE = 9, SW_SHOWNORMAL = 1; for (int a = 0; a < processes.Length; a++) { IntPtr hWnd = processes[a].MainWindowHandle; ShowWindowAsync(hWnd, SW_RESTORE); ShowWindowAsync(hWnd, SW_SHOWNORMAL); ShowWindowAsync(hWnd, SW_SHOW); SetForegroundWindow((int)hWnd); } //Required Win32 API imports [System.Runtime.InteropServices.DllImport("user32.dll", SetLastError = true)] static extern bool ShowWindowAsync(IntPtr windowHandle, int cmd); [System.Runtime.InteropServices.DllImportAttribute("User32.dll")] private static extern IntPtr SetForegroundWindow(int hWnd); 

你可能会试试

 form.Hide(); 

但请确保从创建它们的同一个线程中显示/隐藏表单

 this.Invoke(new MethodInvoker(this.hide())); 

另一种方法是在TCP线程对象上公开事件 。 它可以定义一个事件,如RecievedData(...)然后GUI可以订阅该事件并自行更新,而无需进行任何InvokeRequired检查等。
更新:链接到C#事件教程
http://msdn.microsoft.com/en-us/library/aa645739%28VS.71%29.aspx

Form.Hide()是隐藏表单的正确方法。 我记得在使用Form.Show()时遇到问题,我有一个模糊的记忆,必须使用Form.Activate()以使表单正确恢复。

您已经正确处理线程编组(InvokeRequired和Invoke)。 您还可以使用Form.BeginInvoke(),它是Form.Invoke的异步版本。 那可能会更快。