我想更改 WPF 主窗口中图标的行为。我已经知道如何更改它的外观 - 根据需要将图标设置为 ImageSource。我希望完成的是,当单击图标时,将打开我自己的自定义菜单,而不是标准的打开/关闭/最小化选项。
有任何想法吗?
将此代码放在您的 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;
}