使用NativeWindow显示任务栏项

Dav*_*own 5 .net c# taskbar windows-7 nativewindow

我的应用程序旨在几乎完全通过Windows 7任务栏项目使用缩略图和跳转列表.我知道我可以很容易地创建一个Form并简单地隐藏它,但这看起来有点矫枉过正.另外,我想NativeWindow尽可能多地玩弄,因为我之前从未使用它.

从本质上讲,我有一个被称为RootWindow派生的类NativeWindow,它将处理热键,希望其他一切.我根本不需要一个可见的窗口,只是处理窗口消息并提供一个任务栏项目,我可以附加缩略图和跳转列表.

CreateParams我需要传递一些特殊选项CreateHandle吗?还是我运气不好?

编辑:嗯,它比我想象的要容易,虽然它不是我想要的.一旦我NativeWindowShowWindowAPI 的句柄传递给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);
    }
}
Run Code Online (Sandbox Code Playgroud)

Dav*_*own 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);
Run Code Online (Sandbox Code Playgroud)

我还禁用了窗口的 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));
Run Code Online (Sandbox Code Playgroud)