【发布时间】:2014-01-16 04:09:57
【问题描述】:
我有一个通常最小化运行的实用 WinForm 应用程序。它用于制造工厂的 PC 上。我想让应用程序在最小化时变得不可见,以防止意外关闭表单或使用某些设置。并非万无一失,只是要小心一点。
但是,我无法让应用程序的主窗体和唯一窗体重新出现,从同一应用程序的另一个实例向其发送 WM_SYSCOMMAND、SC_RESTORE 消息。
我已将Resize_Event 设置为在未最小化时将Visible 设置回true。
我试过SendMessage 和PostMessage。如果我在不将表单的 Visible 属性设置为 false 的情况下允许表单最小化或最大化,则调用会按预期工作并且目标表单会调整大小。
表单的消息泵是否未在此状态下运行,因此它忽略了消息?
我应该创建另一个线程来每隔一段时间检查一个消息队列吗?这是怎么做到的?
正在恢复表单的应用中的示例代码:
...
Process current = Process.GetCurrentProcess();
foreach (Process process in Process.GetProcessesByName("MyApp")) { //current.ProcessName)) {
if (process.Id != current.Id) {
SendMessage(process.MainWindowHandle, WM_SYSCOMMAND, (IntPtr)SC_RESTORE, (IntPtr)0);
Interaction.AppActivate(process.Id); //Most reliable way to focus target
SetForegroundWindow(process.MainWindowHandle);
break;
}
}
...
恢复可见性的目标形式的代码。
// If form is minimized then hide it
if (WindowState == FormWindowState.Minimized) {
this.Visible = false;
}
else {
this.Visible = true;
}
【问题讨论】:
-
在最小化时创建托盘图标可能比让用户尝试重新启动应用程序只是为了再次显示它更好。这样做时,您将保持在同一个流程中,并且不需要处理任何 IPC 混乱。
-
这是我考虑过的另一个想法。在那里重新打开并不那么明显。
-
@HansPassant - 是的,它基于此,但奇怪的是我无法以这种方式处理隐藏表单。
-
该答案明确向您展示了如何恢复窗口。它不需要“句柄”,事件处理程序在进程的第一个实例中运行,因此不需要任何类型的进程互操作。 .NET 负责处理它。我不可能猜到“怪癖”可能是什么。
标签: c# winforms visibility message-queue