在Windows XP Embedded上,禁用每个控件的C#Winforms应用程序中的右键单击(按住)

我正在使用Windows XP Embedded上运行的触摸屏应用程序。 如果用户按下并按住几秒钟,上下文菜单将出现。 但是,这会干扰按住滚动条等控件,阻止用户一直滚动到最后。 但是,我不想在应用程序范围内禁用右键单击function。 我只想把滚动条等控件排除在这个动作之外。

当用户按下触摸屏上滚动条上的向下箭头时,日志显示:

----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(); 

我也尝试了一个鼠标钩,我完全禁用右键和中键,上下文菜单效果仍然导致鼠标左键停止用户的操作。

基本上,似乎没有办法从这个恢复,我还没有find任何解决此问题的解决scheme。 不过,有一个类似的问题关于在stackoverflow WPF上的答案是重写控件的OnPreviewMouseRightButtonDown和OnPreviewMouseRightButtonUp,Winforms中不存在。

帮帮我!

在你的情况下,我只有一个想法如何可以实现这个结果。

你应该做一个方法来显示弹出式菜单,并在窗体上添加一个时间控件。

OnMouseDown事件启动你的计时器控制和汉德尔计时器的滴答事件,存储在一个变量的开始时间,并检查每一个滴答,如果你想该用户应该按3秒,那么你应该像这样检查,认为你有变量开始时间名为“StartTime”:

 if((DateTime.Now - StartTime).Seconds >= 3) 

如果经过时间超过3秒,则显示弹出菜单

现在OnMouseUp事件你应该停止计时器。