当前位置: 首页 > 知识库问答 >
问题:

如何使用Java Robot在不依赖键盘布局的情况下按下特殊字符?

华阳秋
2023-03-14

我目前正在开发一个扫描条形码并将其内容转换为击键的小应用程序。

使用java发送基本信件非常简单。awt。机器人,但一旦需要使用元键来生成角色,它就会变得复杂。关键事件。例如,VK_BACK_SLASH存在并映射到我键盘上的右键,但发送该键的按下和释放不会导致反斜杠,因为它缺少ALT-GR元键(德语布局)。我现在可以继续并发送VK_ALT_GRAPH键代码的按下和释放,但一旦使用不同的键盘布局,这将停止工作,这需要一个不同的元键,如美国布局。

是否有任何方法可以检测必须按下哪些键才能生成特定字符,或者是否有一个API可以接受字符或字符串并发出相应的键事件?我对任何可能实现这一点或可以扩展的库都持开放态度。

如果没有API或库可用于正确地确定键盘布局,是否有API或库允许我检测当前配置的键盘布局?这至少可以让我在必要时调整按键。

我目前用于将字符映射到击键的代码可以在这里找到:

fun mapActionToPrefixSuffix(action: Action): Pair<List<Pair<Int, Action.Do>>, List<Pair<Int, Action.Do>>> {

    val fKeys = (1..24).map { i -> "F$i" }.toSet()
    val special = mapOf(
            Pair("ENTER",     VK_ENTER),
            Pair("RETURN",    VK_ENTER),
            Pair("BACKSPACE", VK_BACK_SPACE),
            Pair("SPACE",     VK_SPACE),
            Pair("CTRL",      VK_CONTROL),
            Pair("SHIFT",     VK_SHIFT),
            Pair("ALT",       VK_ALT),
            Pair("ALTGR",     VK_ALT_GRAPH),
            Pair("CONTEXT",   VK_CONTEXT_MENU),
            Pair("WIN",       VK_META),
            Pair("TAB",       VK_TAB)
    )
    val charKeys = mapOf(
            Pair('\\', VK_BACK_SLASH),
            Pair('/',  VK_SLASH),
            Pair('!',  VK_EXCLAMATION_MARK),
            Pair(' ',  VK_SPACE),
            Pair(':',  VK_COLON),
            Pair(';',  VK_SEMICOLON),
            Pair('-',  VK_COMMA),
            Pair('@',  VK_AT),
            Pair('^',  VK_CIRCUMFLEX),
            Pair('=',  VK_EQUALS),
            Pair('_',  VK_UNDERSCORE),
            Pair('.',  VK_PERIOD),
            Pair('€',  VK_EURO_SIGN),
            Pair('$',  VK_DOLLAR),
            Pair('&',  VK_AMPERSAND),
            Pair('>',  VK_GREATER),
            Pair('<',  VK_LESS),
            Pair('(',  VK_LEFT_PARENTHESIS),
            Pair('(',  VK_RIGHT_PARENTHESIS),
            Pair('[',  VK_OPEN_BRACKET),
            Pair(']',  VK_CLOSE_BRACKET),
            Pair('{',  VK_BRACELEFT),
            Pair('}',  VK_BRACERIGHT),
            Pair('\t', VK_TAB),
            Pair('\n', VK_ENTER),
            Pair('\r', VK_ENTER)
    )

    return if (action.key.length == 1) {
        val c = action.key[0]
        when {
            isLetterOrDigit(c) -> parseLetter(c)
            charKeys.containsKey(c) -> pressAndRelease(charKeys.getValue(c))
            else -> Pair(emptyList(), emptyList())
        }
    } else {
        val key = action.key.toUpperCase()
        when {
            fKeys.contains(key) -> parseFKey(key)
            special.containsKey(key) -> pressAndRelease(special.getValue(key))
            else -> Pair(emptyList(), emptyList())
        }
    }
}

https://github.com/pschichtel/VirtualScanner/blob/bfbe44bea8412713104d3051b6f7332aa8ee13c7/src/main/kotlin/tel/schich/virtualscanner/actions.kt#L61-L121

提前感谢您的帮助!

共有1个答案

唐弘益
2023-03-14

我一直无法找到一个独立于平台的解决方案来解决这个问题,于是我选择了手动方式:创建一个简单的文件,将字符映射到一系列键盘操作(按下和释放按钮)。这样,每个用户都必须为is键盘布局创建这样的文件才能使用该工具。

 类似资料:
  • 我正在尝试使用selenium创建自动化,以安装chrome扩展。当我尝试在amazon虚拟机上运行这个jar时,我遇到了一个问题,因为当我尝试用robot类按enter键时,它不起作用,因为我没有连接物理键盘。我不能在selenium中使用sendkeys,因为来自google的pop不在同一页面,selenium无法识别它。有什么解决办法吗?

  • 问题内容: 当前,当我发出此SQL时,它将获得不同的用户名。 我有一些不同的用户名,它们代表组,例如。 我想将所有其他用户名(恰好是数字)分组为一个组,例如 我可以实现以下目标吗? 编辑:从答案修改的查询 问题答案: @bfavaretto很好(对他+1),但是如果您不了解前缀或前缀不同,则可以使用类似以下内容的方法:

  • 我正在尝试构建一个自动化脚本来安装chrome扩展。 在我的本地系统(windows 10)上,当使用java的Robot类时,所有这些都可以正常工作,因为我有一个物理键盘连接到我的计算机。 问题是——当我试图在虚拟机(亚马逊EC2,视窗服务器)上运行这种自动化时,机器人类不起作用,因为它无法检测键盘的物理连接。 有没有其他方法可以在不连接键盘的情况下模拟键盘行程? 仅供参考,我必须使用键盘,因为

  • 为什么它抛出一个错误?任何帮助都将不胜感激 编辑:

  • 我正在尝试安装一个没有依赖项的python模块。 我跑: 但是这个安装依赖项,任何想法怎么能做到这一点?

  • 问题内容: 我有一个带有一些视图的布局,其中一个是EditText。布局很容易放在一页上,但当软键盘退出时,布局不会滚动。这是我的布局的回顾: 在清单中,我声明了该属性: 有谁知道为什么它不起作用以及如何确保它起作用? 提前致谢! 问题答案: 好的,显然不应该将ScrollView 设置为。我将其设置为并将其设置为页面底部的按钮。 不要问我为什么,但这可以解决问题。