使用NativeWindow显示任务栏项

时间:2010-04-12 02:50:39

标签: c# .net windows-7 taskbar nativewindow

我的应用程序旨在通过使用缩略图和跳转列表几乎完全通过Windows 7任务栏项工作。我知道我可以很容易地创建一个Form而只是隐藏它,但这看起来有些过分。另外,我想尽可能多地玩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);
    }
}

1 个答案:

答案 0 :(得分: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));