如何找出谁破坏KEY_TYPED事件



我有一个Java应用程序,它有许多文本字段,我可以通过按`然后按e来输入例如é。这是许多应用程序中已知的行为。

现在,在特定的用户操作(启动应用程序的特定模块)之后,应用程序中的所有文本字段将无法键入é

以下是我所做的:

它发生在Windows还是Linux上?仅限Windows。

这种情况会发生在特定的JVM中吗?AFAIS没有-使用6-32/64和7-32/64我可以重现这个问题。

它是否发生在应用程序的特定代码库中?是的,但我无法在Eclipse中重现这个问题,这可能是有用的信息。只有打包的应用程序才有问题。

发生了什么事件?

启动模块前:

*!*!* dispatching: java.awt.event.KeyEvent[KEY_PRESSED,keyCode=129,keyText=Akut (Dead),keyChar='┤',keyLocation=KEY_LOCATION_STANDARD,rawCode=221,primaryLevelUnicode=180,scancode=13,extendedKeyCode=0x81] on mainFrame
*!*!* dispatching: java.awt.event.KeyEvent[KEY_RELEASED,keyCode=129,keyText=Akut (Dead),keyChar='┤',keyLocation=KEY_LOCATION_STANDARD,rawCode=221,primaryLevelUnicode=180,scancode=13,extendedKeyCode=0x81] on mainFrame
*!*!* dispatching: java.awt.event.KeyEvent[KEY_PRESSED,keyCode=69,keyText=E,keyChar='e',keyLocation=KEY_LOCATION_STANDARD,rawCode=69,primaryLevelUnicode=101,scancode=18,extendedKeyCode=0x45] on mainFrame
*!*!* dispatching: java.awt.event.KeyEvent[KEY_TYPED,keyCode=0,keyText=Unbekannt keyCode: 0x0,keyChar='Ú',keyLocation=KEY_LOCATION_UNKNOWN,rawCode=0,primaryLevelUnicode=0,scancode=0,extendedKeyCode=0x0] on mainFrame
*!*!* dispatching: java.awt.event.KeyEvent[KEY_RELEASED,keyCode=69,keyText=E,keyChar='e',keyLocation=KEY_LOCATION_STANDARD,rawCode=69,primaryLevelUnicode=101,scancode=18,extendedKeyCode=0x45] on mainFrame

启动模块后:

*!*!* dispatching: java.awt.event.KeyEvent[KEY_PRESSED,keyCode=129,keyText=Akut (Dead),keyChar='┤',keyLocation=KEY_LOCATION_STANDARD,rawCode=221,primaryLevelUnicode=180,scancode=13,extendedKeyCode=0x81] on mainFrame
*!*!* dispatching: java.awt.event.KeyEvent[KEY_RELEASED,keyCode=129,keyText=Akut (Dead),keyChar='┤',keyLocation=KEY_LOCATION_STANDARD,rawCode=221,primaryLevelUnicode=180,scancode=13,extendedKeyCode=0x81] on mainFrame
*!*!* dispatching: java.awt.event.KeyEvent[KEY_PRESSED,keyCode=69,keyText=E,keyChar='e',keyLocation=KEY_LOCATION_STANDARD,rawCode=69,primaryLevelUnicode=101,scancode=18,extendedKeyCode=0x45] on mainFrame
*!*!* dispatching: java.awt.event.KeyEvent[KEY_TYPED,keyCode=0,keyText=Unbekannt keyCode: 0x0,keyChar='e',keyLocation=KEY_LOCATION_UNKNOWN,rawCode=0,primaryLevelUnicode=0,scancode=0,extendedKeyCode=0x0] on mainFrame
*!*!* dispatching: java.awt.event.KeyEvent[KEY_RELEASED,keyCode=69,keyText=E,keyChar='e',keyLocation=KEY_LOCATION_STANDARD,rawCode=69,primaryLevelUnicode=101,scancode=18,extendedKeyCode=0x45] on mainFrame

正如您在输出中看到的,编码显然是我所知甚少的一点。所以编码可能是一个问题,尽管我不明白在哪里设置它,也不明白为什么问题只会在特定的时间点之后发生。所以就我个人而言,我不认为编码是原因。我尝试使用-Dfile.encoding=Cp1252 -Dfile.encoding=ISO-8859-15,但这个问题在Eclipse之外的Windows上仍然存在,在Linux或Eclipse内部都没有出现。

那么我期待什么呢?我需要一个能告诉我应该寻找什么的人来找出这个奇怪问题的原因。我发现的任何关于KeyEvents的文档对初学者来说都太多了,我现在需要这些文档。谁构建KEY_TYPED事件?或者谁负责操纵错误的事件?

提前感谢!!

好的,我通过简单的远程调试和stepping找到了问题的原因。抛出了事件传递的所有步骤。这很烦人,因为没有解决方案来分析下一个此类问题

在我的案例中,问题是在恶意模块的深处,一个名为KeyboardFocusManager.getCurrentKeyboardFocusManager().addKeyEventDispatcher(..)KeyboardFocusManager.getCurrentKeyboardFocusManager().addKeyEventPostProcessor(..)的类将事件重定向到它的对象,以对KeyEvents做出反应,即使它们发生在子组件中。

问题是这个调度器和处理器调用了e.consume(),这可能会影响KEY_TYPED事件的创建。事实是,当删除事件的消耗时,一切都会正常工作。

在eclipse内部,这件事并没有发生,因为有些类不在类路径上,因此在查找失败后,此时就没有调用恶意类。令人沮丧。

尽管我找到了解决方案,但有趣的是,我可以采取哪些步骤来调试这样的东西?或者是否有任何关于如何在低级别创建事件的文档?

相关内容

  • 没有找到相关文章

最新更新