保持申请/表格活跃

时间:2013-11-28 10:46:40

标签: c# winforms compact-framework

我们的kiosk模式应用程序使用Process.Start()启动基于表单的实用程序。在一种设备类型上,偶尔会在实用程序启动后直接激活主应用程序,因为某些(未知)原因,隐藏了实用程序应用程序的UI。有没有办法让实用程序保持激活状态?我们目前正在使用TopMost = true,但这并不妨碍将焦点转移到主应用程序,导致热键不能按预期运行。

工作流:

  1. 应用程序A当前显示在应用程序中某处以ShowDialog()打开的表单(AnotherForm)
  2. AnotherForm包含一个按钮,该按钮将通过调用Process.Start()
  3. 启动应用程序B.
  4. 应用程序B使用Application.Run()
  5. 打开表单(YetAnotherForm)

2 个答案:

答案 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();
  }
}