Dav*_*own 5 .net c# taskbar windows-7 nativewindow
我的应用程序旨在几乎完全通过Windows 7任务栏项目使用缩略图和跳转列表.我知道我可以很容易地创建一个Form并简单地隐藏它,但这看起来有点矫枉过正.另外,我想NativeWindow尽可能多地玩弄,因为我之前从未使用它.
从本质上讲,我有一个被称为RootWindow派生的类NativeWindow,它将处理热键,希望其他一切.我根本不需要一个可见的窗口,只是处理窗口消息并提供一个任务栏项目,我可以附加缩略图和跳转列表.
CreateParams我需要传递一些特殊选项CreateHandle吗?还是我运气不好?
编辑:嗯,它比我想象的要容易,虽然它不是我想要的.一旦我NativeWindow将ShowWindowAPI 的句柄传递给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)
诀窍是将窗口的样式设置为 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)