2009-06-23 266 views
0

我正在爲運行Windows XP的某些信息亭構建一個相當專業的屏幕保護程序。用戶往往會離開亭沒有瀏覽器返回到首頁,讓屏幕保護程序執行以下操作:通過標準屏幕保護機制 Windows XP屏幕保護程序 - 使用屏幕保護程序啓動過程死亡

    1. 推出通知用戶一直沒有最近的活動,並瀏覽器將在X秒內關閉。
    2. 如果X秒內通過,而無需用戶活動,屏幕保護程序殺死所有當前瀏覽器實例(通過Process.GetProcessesByName),並開始指向配置的網站(通過的Process.Start)瀏覽器的新實例。
    3. 屏幕然後「空白」,直到用戶移動鼠標或按下一個鍵 - 此時屏幕保護程序退出。

    當這個運行在Windows Vista或2008,按預期工作的一切。

    然而,在Windows XP(這是亭正在運行的),當保護程序退出屏幕,瀏覽器進程被終止。如果在屏幕保護程序存在之前添加Thread.Sleep,則可以查看瀏覽器並與其進行交互,直到屏幕保護程序退出。

    使事情更混亂,當我通過單擊設置區域中的「預覽」按鈕,運行屏幕保護程序的Windows XP不會出現此行爲 - 也就是說,它的行爲如預期。在這種情況下運行完全相同的代碼。

    我在.NET 2.0框架下測試了這個,後來安裝了.NET 2.0 SP1。在Windows 2008工作站上,我有3.5 SP1。

    有相對於依賴於啓動的進程,這些版本的.NET之間存在一些差異?是否有一些標誌可以確保啓動的瀏覽器進程不會「附加」到屏幕保護程序?

  • 回答

    1

    有一些code at CodeProject封裝了Windows桌面API。它包含一個功能,可以在不同的桌面上打開一個新進程,如果不是直接使用,您至少可以查看該進程。 (基本上,Windows API CreateProcess函數有一個參數,允許您指定啓動該進程的桌面。)

    如果這樣不起作用,您可能還會嘗試使用my answer to your other question(關於使用SendMessage進程間獲取除屏幕保護程序以外的另一個進程實際執行啓動)。這並不是解決流程樹問題的最佳答案,但如果流程樹不是問題,它可能會真正起作用。

    +0

    我不得不做你的第二個建議(IPC)。我最終使用了新的(.NET 3.5)NamedPipeServerStream和NamedPipeClientStream類來實現它,它運行良好。 我首先嚐試了第一個建議,但是從測試中看來,Windows XP似乎遵循一個「帶和吊帶」規則:它似乎既殺死進程樹又運行在不同的桌面上,最後IPC方法是更容易實施。 – user127665 2009-06-26 15:21:42

    0

    嘗試調用的Process.Start前Process.StartInfo.UseShellExecute設置爲False(它默認爲true),()。這樣,CreateProcess()在內部使用,而不是ShellExecute()。

    0

    Windows XP在其自己的虛擬桌面上運行屏幕保護程序。除非另有說明,否則從此處開始的任何進程都將繼承自己的虛擬桌面。當屏幕保護程序退出時,虛擬桌面將消失並被真正的桌面所替代,並且可以!

    編輯:欲瞭解更多信息,請參閱以下微軟MSDN網頁:

    Desktops (Windows)
    CreateProcess function (Windows)
    STARTUPINFO Structure

    +0

    這聽起來像它可能是問題 - 你如何指定運行子進程的桌面? – user127665 2009-06-24 05:15:46

    相關問題