2015-04-19 1 views
-1

(Я пытаюсь сделать код SendKeys из Интернета с расширенными символами.) Sendkeys - это имитация VB SendKeys. Есть несколько алгоритмов, которые я видел в Интернете, плюс тот, который пришел с Delphi 7. Моя программа использует его для отправки нажатий клавиш другим программам, чтобы сделать запись данных более быстрой и последовательной. Он работает хорошо, за исключением символов, которые Ord() сообщает с номером более 255.Получение кодов клавиш для Alt + Цифровая клавиатура для использования в SendKeys

После публикации этого вопроса я обнаружил, что карта символов сообщает Alt + 0128 через Alt + 255. И получается, что только 26 таких символов сообщаются Ord() с тем, что, как представляется, является значением unicode. Таким образом, у меня теперь есть уродливая работа, которая просто заменяет значения, сообщенные Ord(), с альтернативными, более низкими значениями, указанными в Символьной карте. Поэтому мои Sendkeys теперь совместимы с кодировкой Ansi в «Блокноте».

Я надеялся на простое преобразование символов, например AnsiChar(), но это дало совершенно неправильные значения Ord().

Я использую шрифты Delphi XE2 и Arial для всего этого вопроса. Утилита «Карта символов Windows» сообщает, что Alt + 0147 создает «Левую двойную метку котировки».

Эта комбинация клавиш обеспечивает «символ в элементе управления Delphi,« Блокнот »и« Слово ».

Все мои интернет-исследований говорит использовать Ord(), чтобы определить числовое значение символа:

Procedure ShowNumericKeypadCode(ch: Char); 
begin 
    showmessage('Key code = ' + Format('%4.4d',[Ord(ch)])); 
end; 

Но это возвращает 8220, а не 0178. Alt + 8220 урожайности ∟ в Notepad и Delphi управления, но он все еще производит «в Слове».

Это, очевидно, что-то делать с Анси против Unicode, но я не могу понять, как написать функцию в Delphi, который будет возвращать 0178 вместо 8220.

Iconv не будет полезным, поскольку цель должен иметь самостоятельную программу. Благодарю.

+0

Мы не знаем, что 'SendKeys' есть. Однако подделка более сложного ввода с клавиатуры сложна. Часто зависит от раскладки клавиатуры. Возможно, если вы решите проблему без взломанного ввода, вы получите больше радости. –

ответ

0

Возможно, вы сможете использовать (внешнюю) программу iconv, о которой говорится в character 0xc286 of encoding “UTF-8” has no equivalent in “WIN1252”…On conversion with iconv postgres restore crashes. Это относится к программе, которую можно загрузить с веб-сайта GNU Win32.

Учитывая реализацию iconv, можно преобразовать UTF-8 в ASCII, как это:

iconv -f UTF8 -t US-ASCII//TRANSLIT -o outputfile inputfile 

Для дальнейшего обсуждения, они могут помочь (есть некоторые комментарии по поводу использования iconv.dll непосредственно):

0

Оказалось, что утилита «Карта символов» сообщает коды клавиш от Alt + 0128 до Alt + 0255 для верхних символов ASCII, которые вы можете вводить с помощью цифровой клавиатуры. Он также сообщает еще много символов Unicode с шестнадцатеричным значением. Если вы преобразуете это значение в десятичное число, оно также может быть введено с помощью клавиши Alt + numeric. Я никогда не обнаружил, почему Ord() сообщает значение unicode 8220, но шестнадцатеричное значение - 201C, а карта символов - это тот же символ, что и 0178.Я обнаружил, что из диапазона от 0128 до 0255 есть только 26 символов, которые Ord() сообщает со значением unicode вместо высоких значений ASCII. Это позволяет безобразной работы вокруг:

numStr := Format('%4.4d',[Ord(ch)]); 
 
     numStr := AnsiReplaceStr (numStr,'8216','0145'); //Convert from Unicode to Ansi to work with Notepad AND Word 
 
     numStr := AnsiReplaceStr (numStr,'8217','0146'); 
 
     numStr := AnsiReplaceStr (numStr,'8220','0147'); 
 
     numStr := AnsiReplaceStr (numStr,'8221','0148'); 
 
     numStr := AnsiReplaceStr (numStr,'0381','0141'); 
 
     numStr := AnsiReplaceStr (numStr,'8226','0149'); 
 
     numStr := AnsiReplaceStr (numStr,'8211','0150'); 
 
     numStr := AnsiReplaceStr (numStr,'8364','0128'); 
 
     numStr := AnsiReplaceStr (numStr,'8218','0130'); 
 
     numStr := AnsiReplaceStr (numStr,'0402','0131'); 
 
     numStr := AnsiReplaceStr (numStr,'8222','0132'); 
 
     numStr := AnsiReplaceStr (numStr,'8230','0133'); 
 
     numStr := AnsiReplaceStr (numStr,'8224','0134'); 
 
     numStr := AnsiReplaceStr (numStr,'8225','0135'); 
 
     numStr := AnsiReplaceStr (numStr,'0710','0136'); 
 
     numStr := AnsiReplaceStr (numStr,'8240','0137'); 
 
     numStr := AnsiReplaceStr (numStr,'0352','0138'); 
 
     numStr := AnsiReplaceStr (numStr,'8249','0139'); 
 
     numStr := AnsiReplaceStr (numStr,'0338','0140'); 
 

 
     numStr := AnsiReplaceStr (numStr,'8212','0151'); 
 
     numStr := AnsiReplaceStr (numStr,'0732','0152'); 
 
     numStr := AnsiReplaceStr (numStr,'8482','0153'); 
 
     numStr := AnsiReplaceStr (numStr,'0353','0154'); 
 
     numStr := AnsiReplaceStr (numStr,'0339','0155'); 
 

 
     numStr := AnsiReplaceStr (numStr,'0382','0158'); 
 
     numStr := AnsiReplaceStr (numStr,'0376','0159');

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