我有一个用NetCore3.1编写的WPF桌面应用程序,它使用KeyDown命令捕捉击键。所有字符都是用键盘捕捉的。当我使用Streamdeck和它的系统文本功能时,它会像键盘一样发送键,我的WPF应用程序没有捕捉到它。
测试在记事本和文本从溪流发送的工作,它应该,例如X1进入。
当我调试时,唯一被发送的东西是Enter键。
private void MyApp_KeyDown(object sender, KeyEventArgs e)
{
if (e.Key == Key.X)
{
//do something
}
}只要有普通的键盘,一切都能正常工作。条形码扫描器也能工作。它不会捕捉到它发送的文本。
在我的项目中有什么需要设置的吗?
发布于 2021-05-24 13:07:52
我本人对有一点兴趣,所以尝试了一下Stream移动应用程序。我发现,当应用程序发送文本时,每个字母都会发送一对带有WM_KEYDOWN 虚拟密钥代码的VK_PACKET和WM_KEYUP窗口消息。这表明该应用程序利用SendInput功能“发送Unicode字符,就好像它们是击键一样”。
然后,幸运的是,我发现UIElement.PreviewTextInput事件可以捕获每个字母。因此,假设文本以Enter键结尾,我们可以通过聚合字母来检索应用程序发送的文本。
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}");
}
}https://stackoverflow.com/questions/67620882
复制相似问题