【问题标题】:Unicode SendKeys Alternative (Any programming language)Unicode SendKeys Alternative(任何编程语言)
【发布时间】:2014-11-07 18:52:06
【问题描述】:

在我回答实际问题之前,我会说,尽管我目前正在使用 Python,但我会接受任何语言的解决方案。我主要是一名 Java 程序员,但由于 Java 仅限于其 JVM,我认为不可能在 Java 中创建它。

目标:

我正在尝试制作一个拦截键盘事件的程序(我已经使用 pyHook 完成了这部分,这是我使用 Python 进行编程的主要原因之一)。基于这些事件和上下文,我需要将 unicode 字符(古希腊语)写入任何聚焦窗口(目前仅适用于 Windows 操作系统,但适用于所有操作系统的统一解决方案似乎很理想)。基本上,这是一个允许我(古典语言学生)输入古希腊语的程序。

问题:

在我需要使用 sendKeys 发送 unicode 字符(如 alpha、delta 或 omega)之前,一切都运行良好。该钩子完美地工作,并且 SendKeys 与普通的 ASCII 字符完美地工作。我尝试了以下库都无济于事:(底部的代码示例)

  • SendKeysCtypes(与博客所说的不支持 unicode 相反)
  • win32com.client 使用 shell 和 SendKeys。
  • SendKeys(另一个库做基本相同的事情)

现在我已经概述了我目前的情况,我有以下问题:

问题

1.是否可以在 SendKeys 中使用 unicode 字符? (到目前为止,谷歌搜索似乎表明这是不可能的)。
由于这可能不是我想知道的情况:
2。是否有任何其他库能够将 unicode 字符发送到焦点窗口?

我想到的另一件事是我可能完全使用了错误的方法(整个模拟按键事件的事情)。任何其他能帮助我达到或至少接近我的目标的解决方案都非常受欢迎。

#coding: utf-8
import time
import win32com
import win32com.client


shell = win32com.client.Dispatch("WScript.Shell")
shell.Run('notepad')
time.sleep(0.1)
shell.AppActivate('kladblok')
shell.SendKeys("When Unicode characters are pasted here, errors ensue", 0)

【问题讨论】:

  • 您使用的是哪种编码? Windows 通常使用 UTF-16le。那是你用过的吗? (更有可能你根本没有编码,或者可能是 UTF-8。)
  • Python 2 还是 Python 3?如果是前者,您发送的是原始 8 位字符串,这些字符串可能被解释为 ANSI 而不是任何形式的 Unicode。
  • @Kevin 源文件有“coding:utf-8”所以这是我的第一个猜测。原始的 8 位 UTF-16le 应该没问题;不然怎么传?
  • @triplee:这是在 Windows 上。所有 Windows API 函数都是 ANSI 或 UTF-16LE。如果您传递一个 8 位 Python 字符串,您可能正在与前者交谈。但是 OP 的代码是 UTF-8,不是 ANSI,所以字符被弄脏了。
  • @Kevin 我使用 python 2.7。我还尝试专门将字符串转换为 unicode 字符串,但这也失败了

标签: python unicode utf-8


【解决方案1】:
shell.SendKeys(u"When Unicode characters are pasted here, harmony shall hopefully ensue".encode("utf-16le"), 0)

您没有跟进 cmets 中的问题,因此这必然是推测性的。

【讨论】:

  • 经过仔细检查,API 似乎很可能被限制为 8 位数据。毫无疑问,MSDN documentation 没有提供任何信息。
  • 我没有跟进问题,因为我睡着了(时区可能很困难)。然而,这个例子做了一些有趣的事情。它不会打印我发送的 Unicode 字符(f.e: α),而是会破坏字符。这是对持续错误的改进:) 我认为问题现在出在“编码(utf-16le)”部分,我将尝试一些其他编码。感谢您的帮助!
  • 您实际询问的内容听起来像是在寻找输入法编辑器。或者是否有您想要使用的特定应用程序不允许您切换到Classical Greek keyboard layout
  • 所以我猜测这个答案上的接受标记并不意味着它实际上有帮助?代表可能的未来访客只是好奇。
  • 接受标记意味着您之前的回复至少在我的道路上帮助了我。我现在将使用脚本和使用 Java 模拟 keyPresses 来更改键盘布局。我已经尝试过了,它有效。使用 SendKeys 发送 unicode 似乎是不可能的。运气不好.. 感谢您的回复!
猜你喜欢
  • 2022-01-06
  • 1970-01-01
  • 1970-01-01
  • 2011-07-21
  • 1970-01-01
  • 2014-11-20
  • 2011-09-13
  • 1970-01-01
  • 2016-07-15
相关资源
最近更新 更多