我正在研究在Windows XP Embedded上运行的触摸屏应用程序。如果用户按住并按住几秒钟,将出现上下文菜单。但是,这会妨碍按下滚动条之类的控件,从而阻止用户一直滚动到最后。但是,我不想在应用程序范围内禁用右键单击功能。我只希望将滚动条之类的控件从此操作中排除。
当用户按下触摸屏滚动条上的向下箭头时,日志会显示:
----Application Starts----
OnMouseDown: Left, Capture = true
[A few seconds later in the log, even though the user is still holding down...]
OnMouseUp: Left, Capture = false
OnMouseCaptureChanged, Capture = false
OnMouseDown: Right
OnMouseDown: Middle
OnMouseCaptureChanged, Capture = false
OnMouseCaptureChanged, Capture = false
OnMouseUp: Right
OnMouseUp: Middle
----Application Ends----
我尝试使用PreFilterMessage过滤掉鼠标右键和中键事件。在自定义滚动条控件的ctor中,我添加了:Application.AddMessageFilter(this);接下来是PreFilterMessage:
public bool PreFilterMessage(ref Message m)
{
switch (m.Msg)
{
case (int)WindowsMessages.WM_RBUTTONDOWN:
case (int)WindowsMessages.WM_RBUTTONUP:
case (int)WindowsMessages.WM_MBUTTONDOWN:
return true;
case (int)WindowsMessages.WM_MBUTTONUP:
System.Diagnostics.Debug.WriteLine("**** Context-menu interruption.");
return true;
}
return false;
}
仍会中断用户的操作。
我试图在WM_MBUTTONUP情况下推送一个OnMouseDown,但这只会导致滚动条在用户放开屏幕后继续滚动,因为他们自己的鼠标按下事件不再在事件队列中,所以没有鼠标停下来。
this.OnMouseDown(new MouseEventArgs(MouseButtons.Left, 1,
MousePosition.X, MousePosition.Y, 0));
我尝试使用SendInput执行向左下移。但是,遇到了和以前一样的问题。
INPUT mouseDownInput = new INPUT();
mouseDownInput.type = SendInputEventType.InputMouse;
mouseDownInput.mkhi.mi.dwFlags = MouseEventFlags.MOUSEEVENTF_LEFTDOWN;
SendInput(1, ref mouseDownInput, Marshal.SizeOf(new INPUT()));
然后我尝试用帖子消息解决这个问题,但这没有帮助。
PostMessage(this.Handle, (int)WindowsMessages.WM_LBUTTONDOWN,
(int)VirtualKeys.MK_LBUTTON,
(uint)((MousePosition.Y << 16) | MousePosition.X));
我也在ctor中尝试了以下操作,但没有效果:
this.ContextMenu = new ContextMenu();
我还尝试了一个鼠标挂钩,我完全禁用了右键和中键,上下文菜单效果仍然导致鼠标左键停止用户的操作。
基本上,似乎没有办法从中恢复,我没有在stackoverflow上找到任何答案来解决这个问题。但是,在stackoverflow上有一个关于WPF的类似问题,其答案是覆盖控件的OnPreviewMouseRightButtonDown和OnPreviewMouseRightButtonUp,这在Winforms中不存在。
帮助!
答案 0 :(得分:0)
在你的情况下,我只知道如何实现这个结果。
你应该制作一个方法来显示弹出菜单并在表单上添加时间控件。
OnMouseDown事件启动你的计时器控制和handel计时器的tick事件,在变量中存储开始时间并在每个tick上检查它,如果你想让用户按下3秒然后你应该检查这样,考虑你有名为“StartTime”的开始时间变量:
if((DateTime.Now - StartTime).Seconds >= 3)
如果经过的时间超过3秒,则显示弹出菜单
现在OnMouseUp事件你应该停止计时器。