如何在 WPF 中追踪文本输入中随机掉落的按键

问题描述 投票:0回答:1

症状 我有一个 C# + WPF 应用程序,它具有复杂的 XAML 场景。应用程序中的某些按钮将打开一个带有文本框的模式对话框,提示用户输入一些文本。我观察到有时钥匙会丢失。例如,如果我输入“abcdef”,我可能只会得到“abdef”。

有关重现该问题的其他一些观察:

  • 如果您输入按键速度更快,效果会更明显
  • 当我有更复杂的场景时更有可能

分析笔记 我尝试过或观察到的一些事情:

  1. TextBox 肯定没有收到任何 TextInput 事件
  2. 如果我挂接到 ComponentDispatcher.ThreadPreprocessMessage,我可以看到事件也丢失了:我们没有获得丢失键的 WM_KEYDOWN 或 WM_CHAR。我们正在获取 WM_KEYUP。
  3. Snoop 也显示出同样的情况。缺少“KeyDown”,但我们确实得到了“KeyUp”
  4. 如果我挂接到 Win32 SetWindowsHookEx(),那么事件不会丢失:我们得到 WM_KEYDOWN 和 WM_KEYUP。
  5. 我想知道是否可能的原因是在 UI 线程中做了太多工作。当我看到故障时,我添加了一个远程线程监视器并输出 StackTraces,但那里没有明显的东西。我实际上修复了一些观察到的故障,但问题仍然存在。

重现 到目前为止,设置最小重现尚未成功。如果我能知道应用程序的哪一部分似乎相关,那么我可以尝试夸大这一点。与此同时,我正在寻找一些见解:

  1. 什么会导致这个问题?
  2. 我如何找出可能的原因?

旁白 第(4)点确实可能给我一个解决方法。当我的 TextBox 获得焦点时,我可以使用 SetWindowsHookEx() 来确保我不会错过任何键,但显然这不是必需的。

c# wpf winapi user-input
1个回答
0
投票

当我最初发布此内容时,我希望获得一些有关 UI 线程中的故障是否会导致此症状的信息。我应该说得更清楚。我找到了各种工具和技术来识别这些问题,但最终它们不是问题所在。我听说如果 UI 线程中有太多处理,确实可以删除消息,但我还没有找到任何详细信息。例如。 100毫秒? 1000毫秒?另外,我怀疑如果是这种情况,您可能会丢失很多消息,而不是间歇性的消息。

逐步禁用功能是最好的方法。事实证明,正在加载一个库,该库显然正在挂接到消息循环中,并且存在一个错误,该错误会间歇性地错误地消耗按键按下事件。这发生在消息到达 WPF 之前,因此 Snoop 甚至没有看到该消息。

回答我原来的问题。

  1. 答案是某个地方的代码挂接到消息循环中。

  2. 我找不到任何诊断工具来找出 WPF 之外订阅或消费消息的内容。

© www.soinside.com 2019 - 2024. All rights reserved.