我想更改WPF主窗口中图标的行为。我已经知道如何改变它看起来 - 将图标设置为我想要的ImageSource。我希望实现的是,当点击图标时,我自己的自定义菜单将打开,而不是标准的打开/关闭/最小化选项。
有什么想法吗?
答案 0 :(得分:0)
将此代码放在WPF窗口中。您可能需要稍微调整一下代码,但这很符合您的要求。它仅适用于右键单击图标。如果您需要左键单击,请使用WM_NCLBUTTONDOWN
作为消息。
它通过拦截当前窗口上的本机窗口消息来工作。 WM_NC *消息负责传递窗口chrome事件。截取事件后,您只需要在正确的位置显示上下文菜单。
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;
}