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

时间:2011-10-25 16:33:44

标签: c# windows winforms windows-xp

我正在研究在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中不存在。

帮助!

1 个答案:

答案 0 :(得分:0)

在你的情况下,我只知道如何实现这个结果。

你应该制作一个方法来显示弹出菜单并在表单上添加时间控件。

OnMouseDown事件启动你的计时器控制和handel计时器的tick事件,在变量中存储开始时间并在每个tick上检查它,如果你想让用户按下3秒然后你应该检查这样,考虑你有名为“StartTime”的开始时间变量:

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

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

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