【问题标题】:Unexpected mouse click event occurs .NET Compact Framework 3.5.NET Compact Framework 3.5 发生意外的鼠标单击事件
【发布时间】:2017-08-28 11:28:14
【问题描述】:

我是 c# .NET Compact Framework 3.5 的新手。

我试图阻止急切的用户排队的鼠标事件。这有时会导致意外点击。

在 .NET Compact Framework 平台上忽略排队的鼠标消息的最佳方法是什么?遗憾的是,代码必须在 UI 线程上运行。

我尝试过: 1.禁用窗口和Application.DoEvents();然后启用窗口-> 它不起作用。 2. 我读了很多关于 PeekMessage() 的文章--> 但不明白。

请推荐我可以学习的资源。

非常感谢。

【问题讨论】:

    标签: c# .net compact-framework message-queue


    【解决方案1】:

    感谢 Google 和其他人,我使用了 PeekMessage()..我会发布一个代码(可能会对某些人有所帮助。)

        private const uint PM_REMOVE = 0x1;
        private const uint WM_MOUSEFIRST = 0x0200;
        private const uint WM_MOUSELAST = 0x0209;
        private const uint WM_QUIT = 0x0012;
        private struct Message
        {
            long hwnd;
            long message;
            long wParam;
            long lParam;
            long time;
            Point pt;
        }
        #if WindowsCE
        [DllImport("coredll.dll")]
        #else
        [DllImport("Kernel32.dll")]
        #endif
    private extern static bool PeekMessage(out Message Msg, IntPtr hWnd, uint wMsgFilterMin, uint wMsgFilterMax, uint wRemoveMsg);
      public void ClearMouseClickQueue()
            {  Message msg;
        while (PeekMessage(out msg, IntPtr.Zero, WM_MOUSEFIRST,WM_MOUSELAST, 1) != false){ }} 
    

    那是……很酷吧……

    【讨论】:

      【解决方案2】:

      禁用触摸输入的另一个选项是使用带有小窗口(元素)的 TouchRegisterWindow 和 TouchUnregisterWindow。这可用于禁用当前对话框中的所有点击,而无需一一禁用所有元素。

      详情http://www.hjgode.de/wp/2012/09/24/windows-mobile-disable-touch-input/

      【讨论】:

      • 非常感谢您的推荐。
      • 这是一个有趣的方法。你能告诉我你是否在其他 CE 和 WinMo / WEH 操作系统上使用过这个。文章中的 cmets 提到它并非全面可用。
      • TouchRegisterWindow 是 Windows Mobile 操作系统的一部分,因为 ???? (至少是 Windows Mobile 2005),因此可以在任何经过​​认证的 Windows Mobile 5/6 设备上使用。
      • @tcarvin 我读了一篇文章。但是问题通过上述解决方案解决了。我没有使用第三方库。因为系统在 SD 卡中运行......所以我有点害怕内存不足或一些相关的问题。最大的问题是我仍然不是专家......非常感谢......
      【解决方案3】:

      类似的东西

      class MyForm : Form
      {
          private bool _processing;
      
          private void OnMousedown(....) // really depends on what you use, 
              // Click/doubleclick/Up/down - concept is the same
          {
              if (_processing)
                  return;
              _processing = true;
              // do something 
              . . . . . . 
      
              _processing = false;
           }
      . . . . . 
      

      您可能需要在每个控制事件上执行此操作

      【讨论】:

      • 非常感谢您的回答。我尝试了相同的代码。最奇怪的是,有时它会丢弃点击事件,但有些情况下却出现了意想不到的鼠标点击事件。
      • @Tuvi 记住表单也是控件,你也可以尝试使用锁
      • 首先感谢您的建议。问题是我的窗口由许多组件组成,并且一些控件相互关联,这就是为什么上述方法处理起来有点复杂。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-14
      • 2020-05-14
      相关资源
      最近更新 更多