2011-04-30 111 views
0

我使用Visual Basic 2008隐藏/显示程序窗口

,比如我有运行notepad.exe,我可以隐藏记事本窗口,然后,如果我需要它再次显示它?

谢谢。

+0

这比您想象的要困难得多。如果你是一个开始学习VB.NET的程序员,那么这是你需要做的最后一件事。它要求您从Windows API调用函数,使用P/Invoke从托管代码中调用非托管代码。这是可能的,但我不一定会推荐它。你想解决什么问题?为什么你的应用程序需要控制其他应用程序(如记事本)?程序应该独立于其他程序运行。如果您需要编辑文本,请使用工具箱中的“TextBox”控件;它几乎与记事本一样 – 2011-04-30 11:43:45

回答

5
  • 致电​​通过"notepad"
  • 然后从返回的过程中读取MainWindowHandle
  • P/Invoke ShowWindow()传递SW_HIDESW_SHOW隐藏/显示窗口。

P/Invoke signature是:

<DllImport("user32.dll", SetLastError:=True, CharSet:=CharSet.Auto)> _ 
Private Shared Function ShowWindow(ByVal hwnd As IntPtr, ByVal nCmdShow As Integer) As Boolean 
End Function 

ShowWindow()主题列出的数值为SW_*标志。


感谢@Alex K代表建议作为注释使用ShowWindowAsync()而非ShowWindow()

<DllImport("user32.dll", SetLastError:=True, CharSet:=CharSet.Auto)> _ 
Private Shared Function ShowWindowAsync(ByVal hwnd As IntPtr, ByVal nCmdShow As Integer) As Boolean 
End Function 

从文档:

该函数将显示窗口 事件到 给定窗口的消息队列。应用程序可以使用此函数来避免在等待 不响应的应用程序完成 处理显示窗口事件时变为 不响应。

+2

更好使用'ShowWindowAsync'作为它针对差异线程拥有的窗口,并且如果目标挂起/不响应,则不会阻塞。 (相同的原型) – 2011-04-30 12:46:53

+0

@亚历克斯谢谢,更新 – 2011-04-30 12:52:30

+0

谢谢,让它的工作我改变nCmdShow类型为整数,它工作良好,但..它隐藏窗口,但后来我无法显示它,SW_SHOW值是5和我试过ShowWindowAsync(hwnd,5),什么也没有发生......什么是错的? – John 2011-04-30 15:19:26