我们的kiosk模式应用程序使用Process.Start()
启动基于表单的实用程序。在一种设备类型上,偶尔会在实用程序启动后直接激活主应用程序,因为某些(未知)原因,隐藏了实用程序应用程序的UI。有没有办法让实用程序保持激活状态?我们目前正在使用TopMost = true
,但这并不妨碍将焦点转移到主应用程序,导致热键不能按预期运行。
工作流:
ShowDialog()
打开的表单(AnotherForm)Process.Start()
Application.Run()
答案 0 :(得分:2)
你正在给Windows窗口管理员一个非常困难的时间来猜测正确的方法。最大的问题是,在您进行Process.Start()调用时,您的进程中有 no 窗口可以获得焦点。您的对话框刚关闭,没有窗口。这是一个非常难以处理的问题,窗口管理器必须将另一个窗口移动到前台,这样用户就不会完全没有活动窗口。
它使用的确切规则没有记录,我只知道 time 是一个因素。它使进程有机会创建另一个窗口,然后再将其放下并选择另一个进程的窗口。
你让它变得更复杂,因为你给它两个窗口可供选择。窗口管理器还允许进程在活动进程启动时窃取前台。它将选择哪一个现在是一个高度依赖时间的crapshoot。由于需要一些时间来初始化并显示其窗口,因此您开始的过程将失败的可能性非常大。你的YetAnotherForm通常会更快。获得前景的爱。
只是不要强迫窗口管理器做出选择。首先显示YetAnoterForm,然后启动该过程。例如,您可以使用该表单的已显示事件。
答案 1 :(得分:0)
我终于放弃并实施了一个简单的逻辑,阻止实用程序表单停用:
[Conditional("StrangeDeviceType")]
protected override void OnDeactivate(EventArgs e)
{
if (/* currently not terminating */)
{
Activate();
}
}