我的应用程序旨在使用缩略图和跳转列表,几乎完全通过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);
    }
}

最佳答案

技巧是将窗口的样式设置为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));

10-07 18:51