WPF:轮询键盘

时间:2013-10-18 11:05:45

标签: c# wpf multithreading

我正在开发一个在嵌入式设备上运行的WPF应用程序(.NET Standard 4 for embedded)。它有一大堆附加的硬件在我测试时会受到影响,因此我创建了一个DummyHardware接口,除了在运行单元测试时打印日志消息,或者在我的开发PC上独立运行时,它什么都不做。

到目前为止一切顺利。但是:该设备有一个4键键盘,可以进行轮询。我的虚拟键盘类在等待按键时进入无限循环,因为没有键可以按:-)所以我想,“好吧,我会轮询键盘以查看是否1,2,3或按下4“。但我得到了例外

调用线程必须是STA ...

我打电话给Keyboard.IsKeyDown( Key.D1 )时。键盘轮询在单独的线程中进行(以与其余硬件的通常较慢的串行通信分离)。有关如何进行的任何想法?调用

注意:一种替代方法是跳过虚拟硬件上的“等待密钥”测试,但后来我不知道按下了哪个密钥,以下依赖它的代码将无法正常运行。育。

2 个答案:

答案 0 :(得分:4)

您可以将ApartmentState设置为STA。使用Thread.SetApartmentState方法

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;

namespace staThread
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        Thread keyboardThread;

        public MainWindow()
        {
            InitializeComponent();
            keyboardThread = new Thread(new ThreadStart(KeyboardThread));
            keyboardThread.SetApartmentState(ApartmentState.STA);
            keyboardThread.Start();
        }

        void KeyboardThread()
        {
            while (true)
            {
                if (Keyboard.IsKeyDown(Key.A))
                {
                }

                Thread.Sleep(100);
            }
        }
    }
}

答案 1 :(得分:1)

我有一个简单的方法来处理我在UI线程上的运行:

public object RunOnUiThread(Delegate method)
{
    return Dispatcher.Invoke(DispatcherPriority.Normal, method);
}

使用来自UI线程的Dispatcher 初始化Dispatcher.CurrentDispatcher 。它可以从任何线程调用,并使用如下:

UiThreadManager.RunOnUiThread((Action)delegate
{
    // running on the UI thread
});