【问题标题】:Show a taskbar item with a NativeWindow使用 NativeWindow 显示任务栏项目
【发布时间】:2010-04-12 02:50:38
【问题描述】:

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

【问题讨论】:

  • 隐藏窗口会发生什么? (即调用 ShowWindow(hwnd, SW_HIDE)

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


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-12-18
    • 2011-05-02
    • 1970-01-01
    • 1970-01-01
    • 2011-05-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多