2010-06-30 43 views
1

我有一個隱藏的進程,等待非標準的硬件按鈕消息,並運行一個應用程序(與CreateProcess)。用戶不會感到困擾,這是用戶批准他自己的行爲。一切正常,當它是通常的佈局與任務欄顯示和多字幕和非標題窗口。但XP和7的情況不同,當前的應用程序是全屏的。在這種情況下,全屏應用程序是沒有與屏幕尺寸完全相同的邊界的窗口。即使Windows始終打開,Windows仍會隱藏此類應用程序的任務欄。Windows 7是否以不同的方式處理全屏應用程序?

在Xp中,沒有問題,在這種情況下,任務欄和appication(例如計算器)也被顯示,全屏應用程序在啓動應用程序和任務欄以外的區域仍然可見。但是在Windows 7中沒有任何可視化發生,全屏應用程序仍然處於開啓狀態,如果切換到任務欄,執行的應用程序就在那裏。我試圖用SetForegroundWindow,BringWindowToTop,甚至AllowSetForegroundWindow(GetCurrentProcessId())調用與CreateProcess-WaitForIntputIdle-EnumThreadWindows一起找到的窗口句柄來解決它,沒有任何改變。那麼自從XP與正式記錄的全屏窗口有關以來,做了些什麼改變?

感謝,

最大

+0

當你嘗試'SetForegroundWindow'時,你是否也檢查錯誤代碼? (順便說一句,'AllowSetForegroundWindow(GetCurrentProcessId())'是沒有意義的。http://blogs.msdn.com/b/oldnewthing/archive/2009/02/20/9435239.aspx) – jamesdlin 2010-06-30 09:18:39

回答

0

Windows支持多desktops和我的猜測是,全屏了使用不同的桌面不是默認的一個(您的應用程序會顯示)。 Windows中的桌面對象是「一個邏輯顯示錶面,幷包含用戶界面對象,如窗口,菜單和掛鉤」。例如,屏幕保護程序通常在單獨的桌面上啓動。

你可以找到一個應用程序使用Process Explorer中運行的桌面:

  • 設置進程資源管理器,以取代任務管理器,並在上面始終運行。
  • 當你全屏了按Ctrl + Shift + Esc
  • 內處理資源管理器中,選擇全屏過程,然後按Ctrl + H顯示此進程的句柄
  • 見出,推出的Process Explorer 桌面項目的值。這通常會被設置爲默認

如果你知道這個程序正在運行的桌面上,你可以通過先調用OpenDesktop以得到一個處理這個桌面,然後將其傳遞到同一桌面上啓動程序請致電CreateProcessSTARTUPINFO

+0

默認情況下,全屏應用程序使用相同的桌面與其他應用程序一樣。 – 2010-06-30 09:05:55

+0

@Franci Penov:確實,但是誰說這個應用程序有問題?這當然只是一個猜測,但值得一提的是,在這種情況下,使用'CreateProcess'開始的過程將不可見,並且您將看到與OP描述的完全相同的症狀。 – 2010-06-30 09:09:18

+0

你說得對,這是一種可能性。但是,在單獨的桌面上運行並不常見,因此我認爲OP會明確提到它。 – 2010-06-30 09:25:02

1

Vista引入了desktop composition功能。簡而言之,所有窗口都繪製到一個內存位圖上,桌面窗口管理器然後編寫這些位圖並在全屏Direct3D表面上繪圖。全屏窗口不參與桌面組合並直接在屏幕上繪製(主要是因爲大多數全屏應用程序都是需要實時屏幕更新的遊戲)。

特別是,這意味着當全屏應用程序啓動並運行時,它覆蓋了DWM組合圖像,用戶需要切換到DWM管理的窗口,DWM才能開始在完整的頂部繪圖屏幕應用程序。

不幸的是,我對您的問題沒有很好的解決方案。解決這個問題的一種方法是將WS_CAPTION樣式添加到您的應用中,然後自己處理WM_NCPAINT/WM_NCCALCSIZE/WM_NCHITTEST。這可以讓你對DWM說謊,你是一個常規的窗口應用程序,但是可視化地改變你的NC區域,使其看起來像沒有標題。但是,這確實需要一定數量的附加代碼,並且可能需要投入更多的努力。

您可以嘗試解決您的問題的另一種方法是在啓動新過程時明確最小化全屏應用程序窗口。但是,您將不得不解決何時再次使其最大化的問題。

順便說一下,您可能會對Raymond Chen的this post感興趣。

+0

根據我的理解,桌面組合對調用'SetForegroundWindow','BringWindowToTop'等應該不會有影響。 – 2010-06-30 09:13:24

+0

我相信'SetForegroundWindow'被阻止中斷全屏應用程序,以防止後臺進程突然出現在遊戲中。 'BringWindowToTop'操作Z順序,全屏應用程序不參與正常的Z順序(或者在主動時被設置爲最頂層 - 不記得確切) – 2010-06-30 09:22:12

+0

然後,我還沒有研究過幾年,所以我可能已經忘記了我所知道的一切。 :-) – 2010-06-30 09:22:52

1

我會想象一下,如果你有自己的硬件設備,那就是有一些API用於生成「真實」用戶輸入。顯然,傳統鍵盤和鼠標,現在USB HID驅動程序(其中許多是用戶模式,我認爲?)可以訪問API來完成此操作。

Synergy +例如可以在連接的PC上產生虛假的鍵盤和鼠標事件,並且僞造輸入的結果是正常切換窗口。

所以,我最初的想法是讓你的用戶模式「設備」應用合成實際鍵盤消息 - SendInput似乎是「的API,可以‘假’的真實用戶輸入事件可能的候選人

然後,使用一個現在,(假設SendInput IS以正確的級別生成用戶輸入事件),您應該(從WM_HOTKEY處理程序中的你的UI應用程序)擁有許可權(因爲一切都是「用戶啓動的」)來改變前景窗口(對你自己)。

相關問題