2015-05-29 54 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在啓動第三方應用程序竊取的想法。