首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何获得一个WPF桌面应用程序来捕获带有文本字符的命令?

如何获得一个WPF桌面应用程序来捕获带有文本字符的命令?
EN

Stack Overflow用户
提问于 2021-05-20 13:02:21
回答 1查看 174关注 0票数 0

我有一个用NetCore3.1编写的WPF桌面应用程序,它使用KeyDown命令捕捉击键。所有字符都是用键盘捕捉的。当我使用Streamdeck和它的系统文本功能时,它会像键盘一样发送键,我的WPF应用程序没有捕捉到它。

测试在记事本和文本从溪流发送的工作,它应该,例如X1进入。

当我调试时,唯一被发送的东西是Enter键。

代码语言:javascript
复制
private void MyApp_KeyDown(object sender, KeyEventArgs e)
{
    if (e.Key == Key.X)
    {
        //do something
    }
}

只要有普通的键盘,一切都能正常工作。条形码扫描器也能工作。它不会捕捉到它发送的文本。

在我的项目中有什么需要设置的吗?

StreamDeck截图

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-05-24 13:07:52

我本人对有一点兴趣,所以尝试了一下Stream移动应用程序。我发现,当应用程序发送文本时,每个字母都会发送一对带有WM_KEYDOWN 虚拟密钥代码VK_PACKETWM_KEYUP窗口消息。这表明该应用程序利用SendInput功能“发送Unicode字符,就好像它们是击键一样”。

然后,幸运的是,我发现UIElement.PreviewTextInput事件可以捕获每个字母。因此,假设文本以Enter键结尾,我们可以通过聚合字母来检索应用程序发送的文本。

代码语言:javascript
复制
public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
    }

    private readonly StringBuilder _buffer = new();

    protected override void OnPreviewTextInput(TextCompositionEventArgs e)
    {
        if (e.Text is ("\r\n" or "\r" or "\n")) // Key.Return produces a line break.
        {
            if (_buffer.Length > 0)
            {
                OnTextRecieved(_buffer.ToString());
                _buffer.Clear();
            }
        }
        else
        {
            _buffer.Append(e.Text);
        }
        base.OnPreviewTextInput(e);
    }

    protected virtual void OnTextRecieved(string text)
    {
        Debug.WriteLine($"TextRecieved {text}");
    }
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67620882

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档