【问题标题】:How do I generate keyboard events that don't have key code in Java?如何在 Java 中生成没有键代码的键盘事件?
【发布时间】:2015-02-09 01:20:00
【问题描述】:

我正在使用 Robot 类和 KeyEvent 键代码来生成所有其他键事件,它们工作正常,但我还需要韩文键(切换韩语键盘)。显然 KeyEvent 没有这个键的键码,所以我被卡住了:(有没有办法生成这个韩文键事件? 有没有办法使用 Windows 的键码,如 VK_HANGUL (0x15) 而不是 KeyEvent 键码?如果这可能改变所有的关键代码不会是一个问题......或者以某种方式获取一次关键事件并将其永久存储在某个地方并永远使用它......???

我想做的是创建一个包含数字、字母和韩语的屏幕键盘。单击一个图标,它将生成相应字母的键事件,以便键入该字母。 (除了切换到韩语外,一切正常。)

能够生成韩文键事件会很好,但如果这不可能,有什么建议可以帮助我实现这一点吗? 也许我可以将每个韩语字母与键盘上的相应字母绑定(例如 g 是 ㅎ 在既有英语和韩语的传统键盘上)或其他东西,但我如何将它发送到其他应用程序?

对不起,如果这个问题到处都是。我真的迷路了。

【问题讨论】:

  • 这可能会对您有所帮助。不标记为重复,因为它似乎不是重复的(实际密钥与 Unicode 解释)。 stackoverflow.com/questions/397113/…我不是 100% 熟悉 Robot 或 Hangul,所以我不确定是否有解释的 unicode。
  • 感谢您的评论!使用链接中的替代代码实际上是一个好主意。但是,您需要按住“Alt”,然后转到小键盘并按“+”和其他 Unicode 十六进制数字,对吗?如何让机器人按数字键“+”?我试过 SHIFT= 但这不起作用...
  • stackoverflow.com/questions/15605109/java-keybinding-plus-key 我不太擅长关键事件,但这听起来会奏效
  • 另外,由于韩语的方式,(如果有意义的话,一个字母通常是2-3个字符的组合,例如한是ㅎ+ㅏ+ㄴ,有数千种组合)使用 unicode 映射每个字母真的很难。

标签: java keyevent utf


【解决方案1】:

我找到了解决问题的方法。我使用 JNA 来生成键盘事件。

这里有一些代码,以防有人需要。

从 User32.dll 使用 JNA 和 keybd_event 方法的基本知识:

import com.sun.jna.*;    
import com.sun.jna.Native;    
import com.sun.jna.platform.win32.User32;
import com.sun.jna.win32.StdCallLibrary;    
public interface User32jna extends User32 {
 User32jna INSTANCE = (User32jna) Native.loadLibrary("user32.dll",User32jna.class);
 public void keybd_event(byte bVk, byte bScan, int dwFlags, int dwExtraInfo);
}
User32jna u32 = User32jna.INSTANCE;

然后在需要生成关键事件的地方插入这个:

u32.keybd_event((byte) 0x15,(byte)0xF2,0,0);

0x15 和 0xF2 是我正在寻找的韩文/英文切换键的虚拟键码和键盘扫描码,但是查找您需要的任何键的代码然后替换它们,您几乎可以生成任何键事件。

您需要 jna.jar 和 platform.jar 才能使其工作。

【讨论】:

  • 将 JNA 用于此类任务很可能会在未来某个时候破坏您的功能。如今,WINAPI 变化迅速,将您的字节码硬链接到机器码需要在所有目标平台上进行持续测试 - 在某些时候甚至使用常量原语(如您正在使用的原语)重写它,这可能会工作更长时间,因为微软不会经常更改常量 - 但它会发生,这就是他们为这些引入本机宏的原因,它们将始终映射到正确的原语。
  • 是的,这与我最初关心的问题一致,这就是为什么我写了“一个”解决方案而不是“那个”解决方案。最终我认为这对我来说并不重要,因为这只是一个学期的项目。但是,您能告诉我更多有关本机宏的信息吗?我不知道他们存在。我应该搜索哪些关键字来获取相关信息?
  • 简短概述:msdn.microsoft.com/en-us/library/b0084kay.aspx。数以万计的宏中的大多数都是特定于函数的,它们总是在使用它们的每个函数中被提及和解释 - 有些人可能将它们称为参数常量,在你的情况下:msdn.microsoft.com/en-us/library/windows/desktop/… 尤其是msdn.microsoft.com/en-us/library/windows/desktop/… --为此类任务编写本机应用程序通常要好得多,同时遵守所有微软标准。
  • @specializt 谢谢!
猜你喜欢
  • 2012-11-13
  • 1970-01-01
  • 2013-01-09
  • 2018-11-17
  • 2010-11-09
  • 1970-01-01
  • 2020-10-06
  • 2011-11-23
  • 1970-01-01
相关资源
最近更新 更多