Особенности реализации SysGetKey() в Open Object REXX под Windows
Автор: Виктор Смирнов
Дата: 23.05.2015
Источник: vasm.livejournal.com
Продолжая тему предыдущего сообщения, надо сказать, что реализация SysGetKey() в Open Object REXX под Windows имеет естественные отличия от своего прародителя из OS/2, связанные с отличиями операционных систем. При этом она не только унаследовала все его недостатки, но и приобрела новые, один из которых напрочь перекрывает возможность использования даже того несовершенного решения, которое предложено в последнем тестовом примере предыдущего сообщения.
Приведённый ниже тест позволяет убедиться в этом.
Тест № 4:
/* Sample4.cmd - test of SysGetKey() */
parse version _ver
say _ver
say SysVersion()
say 'RexxUtil v.'||SysUtilVersion()
say 'Press Esc to quit'
_key = '';
do while (_key \== '1B'x)
_key = SysGetKey('NOECHO');
say '_key="'||_key~c2x||'"x'
end;
exit;
::requires "rexxutil" library
|
Условия выполнения теста:
- кодовая страница консоли - CP866 или CP1251
- раскладка клавиатуры - RU441
- клавиатура переключена на латиницу
- CapsLock выключен
- чёрный - текст, выводимый на экран во время выполнения
- зелёный - комментарии
- красный - символы кириллицы, соответствующие клавишам после переключения клавиатуры на кириллицу
Выполнение теста № 4:
C:\>Sample4.rex
REXX-ooRexx_4.2.0(MT)_32-bit 6.04 22 Feb 2014
WindowsNT 6.01
RexxUtil v.4.2.0
Press Esc to quit
<--- нажата клавиша 2
_key="32"x => символ "2" (DIGIT TWO)
<--- нажата комбинация клавиш Shift+2
_key="40"x => символ "@" (COMMERCIAL AT)
<--- нажата комбинация клавиш Ctrl+2
_key="00"x => первый символ сканкода "0003"x
_key="03"x => второй символ сканкода "0003"x
<--- нажата комбинация клавиш Alt+2
_key="32"x => символ "2" (DIGIT TWO)
<--- нажата клавиша F1
_key="00"x => первый символ сканкода "003B"x
_key="3B"x => второй символ сканкода "003B"x
<--- нажата комбинация клавиш Shift+F1
_key="00"x => первый символ сканкода "0054"x
_key="54"x => второй символ сканкода "0054"x
<--- нажата комбинация клавиш Ctrl+F1
_key="00"x => первый символ сканкода "005E"x
_key="5E"x => второй символ сканкода "005E"x
<--- нажата комбинация клавиш Alt+F1
_key="00"x => первый символ сканкода "0068"x
_key="68"x => второй символ сканкода "0068"x
<--- нажата клавиша GrayArrowUp
_key="E0"x => первый символ сканкода "E048"x
_key="48"x => второй символ сканкода "E048"x
<--- нажата комбинация клавиш Shift+GrayArrowUp
_key="E0"x => первый символ сканкода "E048"x
_key="48"x => второй символ сканкода "E048"x
<--- нажата комбинация клавиш Ctrl+GrayArrowUp
_key="E0"x => первый символ сканкода "E08D"x
_key="8D"x => второй символ сканкода "E08D"x
<--- нажата комбинация клавиш Alt+GrayArrowUp
_key="00"x => первый символ сканкода "0098"x
_key="98"x => второй символ сканкода "0098"x
<--- нажата клавиша h
_key="68"x => символ "h" (LATIN SMALL LETTER H)
<--- нажата комбинация клавиш Shift+h
_key="48"x => символ "H" (LATIN CAPITAL LETTER H)
<--- нажата комбинация клавиш Ctrl+h
_key="08"x => управляюший символ BS (BACKSPACE)
<--- нажата комбинация клавиш Alt+h
_key="68"x => символ "h" (LATIN SMALL LETTER H)
<--- переключаем клавиатуру на кириллицу
<--- нажата клавиша р
<--- нажата клавиша Enter
_key="E0"x => символ "р" (CYRILLIC SMALL LETTER ER)
_key="0D"x => управляюший символ CR (CARRIAGE RETURN)
<--- нажата комбинация клавиш Shift+р
_key="90"x => символ "Р" (CYRILLIC CAPITAL LETTER ER)
<--- нажата комбинация клавиш Ctrl+р
_key="08"x => управляюший символ BS (BACKSPACE)
<--- нажата комбинация клавиш Alt+р
<--- нажата клавиша Enter
_key="E0"x => символ "р" (CYRILLIC SMALL LETTER ER)
_key="0D"x => управляюший символ CR (CARRIAGE RETURN)
<--- нажата клавиша GrayArrowUp
_key="E0"x => первый символ сканкода "E048"x
_key="48"x => второй символ сканкода "E048"x
<--- нажата клавиша р
<--- переключаем клавиатуру на латиницу
<--- нажата комбинация клавиш Shift+h
_key="E0"x => символ "р" (CYRILLIC SMALL LETTER ER)
_key="48"x => символ "H" (LATIN CAPITAL LETTER H)
<--- нажата комбинация клавиш Ctrl+с
_key="03"x => управляюший символ EOT (END OF TEXT)
<--- нажата клавиша Esc
_key="1B"x => управляюший символ ESC (ESCAPE)
C:\>
|
Результаты теста отличаются от аналогичного теста под OS/2:
- комбинация клавиши Alt с любой символьной клавишей срабатывает как простое нажатие на символьную клавишу,
- нажатие комбинации клавиш Ctrl+c вместо ожидаемого прерывания выполнения и вызова обработки условия HALT возвращает управляющий символ EOT (END OF TEXT),
- нет возврата из функции SysGetKey() после первого нажатия на клавишу со строчной буквой кириллицы "р" (SMALL CYRILLIC LETTER ER). Возврат из функции происходит после следующего нажатия на любую клавишу; в качестве возвращаемого значения используется символ "р" (SMALL CYRILLIC LETTER ER). Возврат значения следующего нажатия происходит при повторном вызове функции SysGetKey() без обращения к буферу клавиатуры.
Такая реализация функции SysGetKey() не оставляет надежд на то, что можно каким-то способом отличить нажатия клавиш расширенной функциональности от нажатия указанной клавиши национального алфавита без привлечения стронних библиотек.