1

我想更改 WPF 主窗口中图标的行为。我已经知道如何更改它的外观 - 根据需要将图标设置为 ImageSource。我希望完成的是,当单击图标时,将打开我自己的自定义菜单,而不是标准的打开/关闭/最小化选项。

有任何想法吗?

4

1 回答 1

0

将此代码放在您的 WPF 窗口中。您可能需要稍微调整代码,但这大致就是您所要求的。它仅适用于右键单击图标。如果您需要左键单击WM_NCLBUTTONDOWN用作消息。

它通过拦截当前窗口上的本机窗口消息来工作。WM_NC* 消息负责传达窗口镶边事件。一旦你拦截了事件,你只需要在正确的位置显示上下文菜单。

    protected override void OnSourceInitialized(EventArgs e)
    {
        base.OnSourceInitialized(e);
        HwndSource source = PresentationSource.FromVisual(this) as HwndSource;
        source.AddHook(WndProc);
    }

    private IntPtr WndProc(IntPtr hwnd, int msg, IntPtr wParam, IntPtr lParam, ref bool handled)
    {
        if (msg == 0xA4) //WM_NCRBUTTONDOWN  
        {
            //Screen position of clicked point
            var pos = new Point(lParam.ToInt32() & 0xffff, lParam.ToInt32() >> 16);

            //Check if we clicked an icon these values are not precise
            // and could be adjusted
            if ((pos.X - Left < 20) && (pos.Y - Top < 20))
            {
                //Open up context menu, should be replaced with reference to your
                // own ContextMenu object
                var context = new ContextMenu();
                var item = new MenuItem { Header = "Test" };
                context.Items.Add(item);
                item.Click += (o,e) => MessageBox.Show("Hello World!");

                //Those are important properties to set
                context.Placement = PlacementMode.AbsolutePoint;
                context.VerticalOffset = pos.Y;
                context.HorizontalOffset = pos.X;
                context.IsOpen = true;

                handled = true;
            }
        }

        return IntPtr.Zero;
    }
于 2013-06-21T20:14:40.230 回答