【发布时间】:2016-02-15 01:11:53
【问题描述】:
自定义 WPF 窗口有一个非常奇怪的问题。窗口完全在 WPF 中设计,WindowStyle=None 和 ResizeMode=NoResize。所以我必须重新实现所有基本的窗口处理东西,比如移动、调整大小和——这就是问题——应用程序上下文菜单。
目前我在应用程序图标和应用程序标题栏的鼠标事件中调用上下文菜单,如下所示:
POINT point=new POINT();
GetCursorPos(out point);
IntPtr handle=GetSystemMenu(new WindowInteropHelper(this).Handle, false);
IntPtr hd=new WindowInteropHelper(this).Handle;
int retvalue=TrackPopupMenu(handle, TPM_RETURNCMD, (int)point.X, (int)point.Y, 0, hd, new IntPtr());
PostMessage(hd, WM_SYSCOMMAND, retvalue, 0);
这是一个你可以在网上找到的代码,看起来每个人都在这样做。
但是,根据我用来显示菜单的事件,会发生以下情况:
鼠标上移:
- 右键单击标题栏/应用程序图标:出现应用程序上下文菜单
- 在不移动鼠标的情况下再次单击鼠标右键:不知何故,在窗口内生成了一个右键单击事件(而鼠标仍指向标题栏)。
搞笑部分:Click 被window.Left 和window.Top 翻译成窗口。如果我正确放置窗口,我可以在鼠标仍然指向 tilebar 时打开窗口内 ListView 的上下文菜单。
鼠标按下:
- 在标题栏/应用程序图标上鼠标右键:出现应用程序上下文菜单
- 鼠标右键向上而不移动鼠标:同样的行为,在窗口内鼠标位置 + window.Left/window.Top 处生成右键单击。
我已经截屏并测量了像素距离以检查它是否真的是 window.Top/Left。
这就是我在尝试解决问题时所做的:
- 测试了对代码的数十次更改,以显示上下文菜单,但没有效果
- 我从窗口类中完全删除了调整大小/移动代码,没有变化
- 使用 EventArgs.Handled,没有变化
- 将在调度程序中截取的代码加入队列,而不是直接在事件中调用,没有变化
【问题讨论】: