gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 10:50:02 25 4
gpt4 key购买 nike

我正在开发一个在 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 过滤掉鼠标右键和鼠标中键的按下和向上事件。在我添加的自定义滚动条控件的构造函数中: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();

我还尝试了一个鼠标钩子(Hook),我完全禁用了右键和中键单击,上下文菜单效果仍然导致鼠标左键向上,从而停止了用户的操作。

基本上,似乎没有办法从中恢复,我也没有在 stackoverflow 上找到任何解决这个问题的答案。但是,在 stackoverflow 上有一个关于 WPF 的类似问题,答案是覆盖控件的 OnPreviewMouseRightButtonDown 和 OnPreviewMouseRightButtonUp,这在 Winforms 中不存在。

帮助!

最佳答案

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

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

OnMouseDown 事件启动您的计时器控件和 handel 计时器的滴答事件,将开始时间存储在变量中并在每次滴答时检查它,如果您希望用户按下 3 秒,那么您应该像这样检查,考虑到您有名为“StartTime”的开始时间变量:

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

如果耗时超过 3 秒则显示弹出菜单

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

关于c# - 在 Windows XP Embedded 上禁用每个控件的 C# Winforms 应用程序中的右键单击(按住),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7892593/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com