症状 我有一个 C# + WPF 应用程序,它具有复杂的 XAML 场景。应用程序中的某些按钮将打开一个带有文本框的模式对话框,提示用户输入一些文本。我观察到有时钥匙会丢失。例如,如果我输入“abcdef”,我可能只会得到“abdef”。
有关重现该问题的其他一些观察:
分析笔记 我尝试过或观察到的一些事情:
重现 到目前为止,设置最小重现尚未成功。如果我能知道应用程序的哪一部分似乎相关,那么我可以尝试夸大这一点。与此同时,我正在寻找一些见解:
旁白 第(4)点确实可能给我一个解决方法。当我的 TextBox 获得焦点时,我可以使用 SetWindowsHookEx() 来确保我不会错过任何键,但显然这不是必需的。
当我最初发布此内容时,我希望获得一些有关 UI 线程中的故障是否会导致此症状的信息。我应该说得更清楚。我找到了各种工具和技术来识别这些问题,但最终它们不是问题所在。我听说如果 UI 线程中有太多处理,确实可以删除消息,但我还没有找到任何详细信息。例如。 100毫秒? 1000毫秒?另外,我怀疑如果是这种情况,您可能会丢失很多消息,而不是间歇性的消息。
逐步禁用功能是最好的方法。事实证明,正在加载一个库,该库显然正在挂接到消息循环中,并且存在一个错误,该错误会间歇性地错误地消耗按键按下事件。这发生在消息到达 WPF 之前,因此 Snoop 甚至没有看到该消息。
回答我原来的问题。
答案是某个地方的代码挂接到消息循环中。
我找不到任何诊断工具来找出 WPF 之外订阅或消费消息的内容。