2010-04-12 28 views
5

我的應用程序旨在幾乎完全通過使用縮略圖和跳轉列表的Windows 7任務欄項目工作。我知道我可以輕鬆創建一個Form並簡單地隱藏它,但這似乎是矯枉過正。另外,我想盡可能多地使用NativeWindow,因爲我以前從未使用它。使用NativeWindow顯示任務欄項目

基本上,我有一個叫RootWindow的類,它來自NativeWindow,它將處理熱鍵和希望的其他所有事情。我根本不需要一個可見的窗口,只是簡單地處理窗口消息並提供一個任務欄項目,我可以將縮略圖和跳轉列表附加到窗口消息。

是否有某種特殊的CreateParams選項我需要傳遞給CreateHandle?或者我運氣不好?

編輯:嗯,它比我想象的要容易,雖然它不是我想要的。一旦我將NativeWindow的句柄傳遞給ShowWindow API,就會出現任務欄項目。但是,它也會在屏幕的左上角顯示一個窗口。有沒有辦法擺脫那個窗口,同時仍然顯示任務欄項目?

public class RootWindow : NativeWindow { 
    public const int SW_SHOWNOACTIVATE = 4; 

    [DllImport("User32.dll")] 
    private static extern int ShowWindow(IntPtr hWnd, short cmdShow); 

    public RootWindow() { 
      CreateHandle(new CreateParams()); 
      ShowWindow(this.Handle, SW_SHOWNOACTIVATE); 
    } 
} 
+0

如果隱藏窗口,會發生什麼情況? (即,調用ShowWindow(hwnd,SW_HIDE) – 2010-04-15 16:35:58

+0

任務欄項目消失。 – 2010-04-15 17:18:26

回答

4

訣竅是將窗口的樣式設置爲WS_POPUP。

const int WS_POPUP = unchecked((int)0x80000000); 
const int SW_SHOWNOACTIVATE = 4; 

CreateHandle(new CreateParams() { 
    Style = WS_POPUP 
}); 

ShowWindow(Handle, SW_SHOWNOACTIVATE); 

我也禁用Aero Peek窗口,因爲它只是用於後臺工作。

const int DWMNCRP_ENABLED = 2; 
const int DWMWA_DISALLOW_PEEK = 11; 

int policy = DWMNCRP_ENABLED; 
DwmSetWindowAttribute(Handle, DWMWA_DISALLOW_PEEK, ref policy, sizeof(int));