【发布时间】: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.dll 和System.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。