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