2014-11-07 1 views
4

Прежде чем перейти к актуальному вопросу, я скажу, что, хотя я сейчас работаю на Python, я приму решение на ЛЮБОЙ язык. Я в основном программист на Java, но поскольку Java довольно ограничен его JVM, я не думал, что это можно будет создать на Java.Unicode SendKeys Alternative (Любой язык программирования)

Цель:

Я пытаюсь сделать программу, которая будет перехватывать событие клавиатуры (я уже сделал эту часть с помощью pyHook, это одна из главных причин, я программирование это в Python) , На основе этих событий и контекста мне нужно написать символы юникода (древнегреческие) в любое сфокусированное окно (в настоящее время только на ОС Windows, но единообразное решение, которое будет работать на всех ОС, кажется идеальным). В основном это программа, которая позволяет мне (ученику классического языка) вводить древнегреческий язык.

Проблемы:

Все не работает прекрасно до того момента, когда мне нужно отправить Юникода, как альфа, дельта или омега, с помощью SendKeys. Крючок отлично работает, и SendKeys отлично работает с обычными символами ASCII. Я попытался следующие библиотеки все безрезультатно: (например, код в нижней части)

  • SendKeysCtypes (вопреки тому, что блог говорит, что не поддерживает Unicode)
  • win32com.client используя оболочку и SendKeys ,
  • SendKeys (Другая библиотека делает в основном то же самое)

Теперь, когда я изложил свою текущую ситуацию, у меня есть следующие вопросы:

Вопросы

1. Возможно ли использовать символы Unicode с SendKeys? (поисковые запросы Google пока показывают, что это невозможно).
Поскольку это, скорее всего, не тот случай:
2. Есть ли другая библиотека, способная отправлять символы юникода в сфокусированное окно?

Еще одна вещь, которая перешла мне на ум, заключается в том, что я могу вообще использовать неправильный метод (вся симуляция события событий нажатия клавиш). Любое другое решение, которое поможет мне достичь или, по крайней мере, приблизиться к моей цели, ОЧЕНЬ приветствуется.

#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) 
+0

Какую кодировку вы используете? Обычно Windows использует UTF-16le. Это то, что вы использовали? (Скорее всего, у вас вообще нет кодировки или, возможно, UTF-8.) – tripleee

+0

Python 2 или Python 3? Если первый, вы отправляете сырые 8-битные строки, которые, вероятно, интерпретируются как ANSI, а не в любой форме Unicode. – Kevin

+0

@Kevin Исходный файл имеет «кодирование: utf-8», так что это будет моя первая догадка. Необработанный 8-бит UTF-16le должен быть хорошим; как еще вы его передали? – tripleee

ответ

1
shell.SendKeys(u"When Unicode characters are pasted here, harmony shall hopefully ensue".encode("utf-16le"), 0) 

Вы не следовали на вопросы в комментариях, так что это обязательно спекулятивным.

+1

. При ближайшем рассмотрении представляется вполне возможным, что API ограничен 8-битными данными. [Документация MSDN] (http://msdn.microsoft.com/en-us/library/8c6yea83.aspx), неудивительно, неинформативна. – tripleee

+0

Я не занимался вопросами, потому что спал (часовые пояса могут быть трудными). Однако, этот пример делает некоторые интересные вещи. Он не печатает символы Unicode, которые я отправляю (f.e: α), но вместо этого он управляет символами. Это улучшение по сравнению с постоянными ошибками :) Я думаю, что проблема теперь в части «encode (utf-16le)», я попробую другие кодировки. Спасибо за помощь! – trb1914

+1

Что вы на самом деле задаете, звучит так, как будто вы ищете редактор методов ввода. Или есть конкретное приложение, которое вы хотите использовать, что не позволяет вам переключиться на [классический греческий расклад клавиатуры] (https://www.google.com/search?q=ancient%20greek%20input)? – tripleee

Смежные вопросы