【发布时间】: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 字符串,但这也失败了