【问题标题】:Mouse.LeftButton == MouseButtonState.Pressed never returning trueMouse.LeftButton == MouseButtonState.Pressed 永远不会返回 true
【发布时间】:2015-02-15 11:27:23
【问题描述】:

我有一个 C# 中的 Windows 窗体应用程序,它监视鼠标按钮是否被按住。 GUI 有一个主线程,它产生一个辅助 STA 线程。此代码永远不会在其中执行:

 if (Mouse.LeftButton == MouseButtonState.Pressed)
 {
    System.Diagnostics.Debug.WriteLine("Left mouse down");
 }

我想知道这是否是因为我为线程启用了以下 STA 选项?

 repeaterThread.SetApartmentState(ApartmentState.STA);
 repeaterThread.Start();

完整的相关代码: 我正在使用PresentationCore.dllSystem.Windows.Input; Winforms 图形用户界面:

按下开始按钮时:

 ...
 Thread repeaterThread = new Thread(() => ListenerThread());
 repeaterThread.SetApartmentState(ApartmentState.STA);
 repeaterThread.Start();
 ...

ListenerThread 方法:

public static void ListenerThread()
{
   while(true)
   {
      if (Mouse.LeftButton == MouseButtonState.Pressed)
      {
         System.Diagnostics.Debug.WriteLine("Left mouse down");
      }
      Thread.sleep(1000);
   }
}

如果鼠标按钮在此线程中被按住,我如何捕获?

谢谢

【问题讨论】:

  • 您是否尝试在循环前在ListenerThread() 内调用Application.Run()
  • 刚试了,没用。 Run() 上的空上下文对吗?
  • 是的。您调用 Run() 不带参数以启动当前线程的消息循环
  • 是的,我试过了,没有运气:(
  • Mouse 类需要 WPF 调度程序循环来提供准确的信息。这里的诊断是您的应用程序运行 Winforms 调度程序循环。换句话说,错误的Application.Run()。交换它不是解决方案,现在 Winforms 变得不稳定,例如,您注意到导航键和快捷键不再起作用。在多个线程上显示 UI 通常也是一个相当糟糕的主意,您可以调试 problems like this

标签: c# .net winforms


【解决方案1】:

问题是您试图混合使用两种 GUI 技术:WinForms 和 WPF。您已设置适合 WinForms 的环境,但尝试使用 WPF 中的方法。

您不需要PresentationCore.dllSystem.Windows.Input。使用System.Windows.Forms.Control类可以达到想要的结果:

public static void ListenerThread()
{
    while (true)
    {
        if ((Control.MouseButtons & MouseButtons.Left) == MouseButtons.Left)
        {
            System.Diagnostics.Debug.WriteLine("Left mouse down");
        }
        Thread.Sleep(1000);
    }
}

【讨论】:

  • 刚刚测试过这个,它不起作用。我正在按照您的建议使用 System.Windows.Forms.Control,完全复制并粘贴您的代码。
  • 在这里工作正常。也许您在线程休眠时按下鼠标?并确保在调用 Application.Run() 之前启动线程
  • 嗯,我从 Form 类中创建并启动了我的线程,所以当用户按下按钮时,它会从 Form 类(即后面的 GUI 代码)创建并启动线程。所以 Application.Run() 总是在线程创建之前发生。这可能是问题吗?
  • 好的,解决了,抱歉,您对 Control.MouseButtons 的建议第一次奏效。我只是把我的代码搞砸了。我没有找到正确的代码路径。非常感谢,标记为答复!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-25
  • 2016-02-08
  • 2020-02-27
相关资源
最近更新 更多