2015-05-29 55 views
-1

我们的软件由两个程序组成。一个exe是一个守护进程,另一个是主应用程序。当我们的主应用程序正在运行时(守护进程当然也是活着的),守护进程窗口TopMost设置为false,主应用程序启动并杀死驻留在托盘中的另一个进程(在Windows Embedded的图像中不可见和禁用)。从主应用程序停用的窗口之一中,我们终止了第三方进程,而不是回到以前的窗口,我们看到了守护进程的窗口。这是因为第三方应用程序被杀害而发生的。如果我们不杀死它,那么我们的主应用会回到适当的窗口。 第三方程序的死亡如何造成这种奇怪的行为?杀死窗户焦点上的过程影响

UPDATE

守护程序启动主应用程序。守护程序,它实现OnActivated如下一个窗口:

private void MainWindow_OnActivated(object sender, EventArgs e) { 
     this.Topmost = true; 
    } 

private void MainWindow_OnDeactivated(object sender, EventArgs e) { 
     this.Topmost = false; 
    } 

杀死在主应用程序窗口之一的停用第三方应用程序意味着,在该窗口OnDeactivated实现如下:

protected override void OnDeactivate(bool close) { 
    Process.Kill(procId); 
} 

“为什么你是否希望“回到前一个窗口”? 那么,主应用程序总是有一个窗口是最顶层=真,有时我们打开模式对话框,而不是用户手动管理这些窗口。尽量减少它们,所以我希望能够通过Calibur去尝试激活的窗口n.Micro。但是当我们要求Caliburn激活另一个窗口并且杀死托盘中的应用程序时,我们的守护程序窗口将变为激活状态并且处于最前端。如果我们评论杀人事件,那么我们会看到我们尝试激活的窗口。

顺便说一句,我们问我们的开发第三方应用程序的同事推出没有UI的版本。这并没有帮助。这只是一个猜测,它失败了。

+0

你要我们列出可能导致一个窗口显示出来,所以你可以选择合适的一个一切可能的办法,或者你认为它可能是一些相关细节添加到您的问题有用吗? – CodeCaster

+0

除了我所说的之外,没有任何相关的细节。 – EngineerSpock

+0

我真诚地恳求不同。上述应用程序如何相互作用?什么是停用,是指在WPF意义上失效(失去焦点)?你如何杀死应用程序?你为什么期望“回到上一个窗口”?其他相关窗口的“TopMost”是什么?你为什么要以这种方式隐藏守护进程窗口,而不是以其他方式工作?但是可以肯定的是,你可以拒绝提供任何额外的细节,以便其他人可以帮助调查,并希望遇到这个特定问题的其他人来代替,但是你的机会相当渺茫。 – CodeCaster

回答

2

那么没有访问测试环境,我的猜测是你并没有完全理解何时OnActivated和OnDeactivated事件触发。

终止一个正在运行的应用程序,其焦点将导致Windows将焦点转移到另一个应用程序,可能是桌面或另一个应用程序。

,因为所有你正在做的是设置Topmostfalse这并不能掩盖或以任何方式禁用窗口,机会是,Windows正在通过聚焦到你的“守护”,这将触发OnActivated事件,轮流设置Topmosttrue

我建议你完全重新考虑你在做什么。

“守护程序”窗口在不显示时应该是不可见的,我认为这会解决您的问题。

0

的问题得到解决通过启动第三方程序如下:

var process = new Process { 
        StartInfo = { 
         FileName = fileName, 
         WorkingDirectory = path, 
         CreateNoWindow = true, 
         UseShellExecute = false 
        } 
       }; 

这里的关键是使用的CreateNoWindow = trueUseShellExecute = falseUseShellExecute = false非常重要,否则CreateWindow属性将被忽略。有关详细信息,可以查看msdn。

解决方案引起@Ashigore的回答后,他的回答把重点由Windows在启动第三方应用程序窃取的想法。