Какие ключевые коды возвращает `getwch`? - PullRequest
7 голосов
/ 27 апреля 2019

Я использую msvcrt.getwch, чтобы сделать интерактивное приглашение в Python для Windows.

В документации сказано:

Считать нажатие клавиши и вернуть полученный символ в виде строки байтов. Ничто не отражается на консоли. Этот вызов блокируется, если нажатие клавиши еще не доступно, но не будет ждать нажатия клавиши Enter. Если нажатая клавиша была специальной функциональной клавишей, она вернет '\ 000' или '\ xe0'; следующий вызов вернет код ключа. С помощью этой функции нельзя прочитать нажатие клавиши Control-C.

Я нашел, что F10 использует первое - \x00D, а F11 - второе \xe0\x85.

Однако это не говорит о том, каковы коды клавиш. Это важно, поскольку у меня нет клавиши \xe0 (à) среди других клавиш, и поэтому я не могу проверить вывод ввода этого значения.


Дополнительный боковой контекст

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

  • CTRL-v - который вводит код клавиши \x16. Что является ключом синхронного холостого хода в ASCII. [1] (Какую комбинацию клавиш я ввел.)
  • Щелчок правой кнопкой мыши (Вставить в PS) - В результате вводится всего \xe0.

    Я не уверен, что Power Shell и Visual C ++ разрешают мне вставлять escape-последовательности или это фактическая обработка этого ключа.


Учитывая, что msvcrt является оболочкой для Visual C ++, я также изучил эту документацию.

Функции _getch и _getwch считывают с консоли один символ, не повторяя его. Ни одна из этих функций не может быть использована для чтения CTRL + C. При чтении функциональной клавиши или клавиши со стрелкой каждая функция должна вызываться дважды; первый вызов возвращает 0 или 0xE0, а второй вызов возвращает фактический код ключа.

Это также не говорит о том, какие коды клавиш.

Я смотрел онлайн, но я могу найти информацию только о виртуальных кодах клавиш , однако это говорит о том, что F10 - \x79, а F11 - \x7A. Поскольку эта функция не возвращает эти значения, я знаю, что она не относится к этим кодам клавиш.

Ответы [ 2 ]

5 голосов
/ 30 апреля 2019

Ответит на это только с помощью Visual C ++.

Функция getwch вернет код сканирования, а не код виртуальной клавиши. следовательно, ссылка на виртуальные коды клавиш недействительна.

Кроме того, согласно MSDN _getch, _getwch документов, при чтении функциональной клавиши или клавиши со стрелкой каждая функция должна вызываться дважды; первый вызов возвращает 0 или 0xE0, а второй вызов возвращает фактический код ключа.

Следующий код вернет правильный код сканирования:

#include<stdio.h>
#include <ctype.h>

int main()
{
    wchar_t ch = _getwch();  //Will return '0'
    ch = _getwch();          //Will return valid scan code
}

Чтобы ответить на ваш вопрос, список действительных кодов сканирования представлен в Спецификация кода сканирования клавиатуры .

Например, второй вызов вышеуказанной функции вернет 68 (0x44) для нажатия клавиши F10, и то же самое будет в MSDN: F10 scan code

Тот же список присутствует в Кодах сканирования ключа , однако не может быть аутентифицирован из-за более старого документа.

0 голосов
/ 02 мая 2019

К сожалению, коды сканирования , представленные в другом ответе, имели некоторые проблемы с отсутствующей функциональностью, неправильными значениями и дополнительной функциональностью.

Чтобы помочь другим, использующим эту функцию, ниже приведена функциональностьчто мой компьютер выставлен с использованием getwch.

Чтобы увидеть таблицу, вы должны запустить следующий фрагмент кода. Это как SE отказывается добавлять MathJax в SO .

<script src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.0/MathJax.js?config=TeX-AMS_HTML-full"></script> <script type="text/x-mathjax-config"> MathJax.Hub.Config({"HTML-CSS": { preferredFont: "TeX", availableFonts:["STIX","TeX"], linebreaks: { automatic:true }, EqnChunk:(MathJax.Hub.Browser.isMobile ? 10 : 50) }, tex2jax: { inlineMath: [ ["$", "$"], ["\\\\(","\\\\)"] ], displayMath: [ ["$$","$$"], ["\\[", "\\]"] ], processEscapes: true, ignoreClass: "tex2jax_ignore|dno" }, TeX: { noUndefined: { attributes: { mathcolor: "red", mathbackground: "#FFEEEE", mathsize: "90%" } }, Macros: { href: "{}" } }, messageStyle: "none" });   </script>

$\text{Key:}$  <br>
$\text{Documented and works}$  <br>
$\color{red}{\text{Missing functionality}}$  <br>
$\color{green}{\text{Additional functionality}}$  <br>
$\color{gray}{\text{Untested}}$  <br>
$\to \text{Changed functionality}$  <br>

<b>$\text{Note}$</b>: $\text{\xe0} = \text{à}$  <br>

$$
\begin{array}{l|r|l|l|l|l}
  \textrm{Name} &
  \textrm{Scan Code} &
  \textrm{Base} &
  \textrm{Shift} &
  \textrm{Ctrl} &
  \textrm{Alt} \\
  \hline
  
  \text{ESC}&\color{gray}{\text{1}}&\text{\x1b}&\text{\x1b}&\color{red}{\text{\x1b}}&\color{red}{\text{\x00\x01}}\\
  \text{1!}&\color{gray}{\text{2}}&\text{1}&\text{!}&&\color{red}{\text{\x00x}} \to \color{green}{\text{1}}\\
  \text{2@}&\color{gray}{\text{3}}&\text{2}&\text{@}&\text{\x00\x03}&\color{red}{\text{\x00y}} \to \color{green}{\text{2}}\\
  \text{3#}&\color{gray}{\text{4}}&\text{3}&\text{#}&&\color{red}{\text{\x00z}} \to \color{green}{\text{3}}\\
  \text{4\$}&\color{gray}{\text{5}}&\text{4}&\text{\$}&&\color{red}{\text{\x00\{}} \to \color{green}{\text{4}}\\
  \text{5%}&\color{gray}{\text{6}}&\text{5}&\text{%}&&\color{red}{\text{\x00|}} \to \color{green}{\text{5}}\\
  \text{6^}&\color{gray}{\text{7}}&\text{6}&\text{^}&\color{red}{\text{\x1e}}&\color{red}{\text{\x00\}}} \to \color{green}{\text{6}}\\
  \text{7&}&\color{gray}{\text{8}}&\text{7}&\text{&}&&\color{red}{\text{\x00~}} \to \color{green}{\text{7}}\\
  \text{8*}&\color{gray}{\text{9}}&\text{8}&\text{*}&&\color{red}{\text{\x00\x7f}} \to \color{green}{\text{8}}\\
  \text{9(}&\color{gray}{\text{10}}&\text{9}&\text{(}&&\color{red}{\text{\x00\x80}} \to \color{green}{\text{9}}\\
  \text{0)}&\color{gray}{\text{11}}&\text{0}&\text{)}&&\color{red}{\text{\x00\x81}} \to \color{green}{\text{0}}\\
  \text{-_}&\color{gray}{\text{12}}&\text{-}&\text{_}&\color{red}{\text{\x1f}}&\color{red}{\text{\x00\x82}} \to \color{green}{\text{-}}\\
  \text{=+}&\color{gray}{\text{13}}&\text{=}&\text{+}&&\color{red}{\text{\x00\x83}} \to \color{green}{\text{=}}\\
  \text{BKSP}&\color{gray}{\text{14}}&\text{\x08}&\text{\x08}&\text{\x7f}&\color{red}{\text{\x00\x0e}} \to \color{green}{\text{\x08}}\\
  \text{TAB}&\color{gray}{\text{15}}&\text{\t}&\color{red}{\text{\x00\x0f}} \to \color{green}{\text{\t}}&\text{\x00\x94}&\color{red}{\text{\x00\x0f}}\\
  \text{Q}&\color{gray}{\text{16}}&\text{q}&\text{Q}&\text{\x11}&\color{red}{\text{\x00\x10}} \to \color{green}{\text{q}}\\
  \text{W}&\color{gray}{\text{17}}&\text{w}&\text{W}&\text{\x17}&\color{red}{\text{\x00\x11}} \to \color{green}{\text{w}}\\
  \text{E}&\color{gray}{\text{18}}&\text{e}&\text{E}&\text{\x05}&\color{red}{\text{\x00\x12}} \to \color{green}{\text{e}}\\
  \text{R}&\color{gray}{\text{19}}&\text{r}&\text{R}&\text{\x12}&\color{red}{\text{\x00\x13}} \to \color{green}{\text{r}}\\
  \text{T}&\color{gray}{\text{20}}&\text{t}&\text{T}&\text{\x14}&\color{red}{\text{\x00\x14}} \to \color{green}{\text{t}}\\
  \text{Y}&\color{gray}{\text{21}}&\text{y}&\text{Y}&\text{\x19}&\color{red}{\text{\x00\x15}} \to \color{green}{\text{y}}\\
  \text{U}&\color{gray}{\text{22}}&\text{u}&\text{U}&\text{\x15}&\color{red}{\text{\x00\x16}} \to \color{green}{\text{u}}\\
  \text{I}&\color{gray}{\text{23}}&\text{i}&\text{I}&\text{\t}&\color{red}{\text{\x00\x17}} \to \color{green}{\text{i}}\\
  \text{O}&\color{gray}{\text{24}}&\text{o}&\text{O}&\text{\x0f}&\color{red}{\text{\x00\x18}} \to \color{green}{\text{o}}\\
  \text{P}&\color{gray}{\text{25}}&\text{p}&\text{P}&\text{\x10}&\color{red}{\text{\x00\x19}} \to \color{green}{\text{p}}\\
  \text{[\{}&\color{gray}{\text{26}}&\text{[}&\text{\{}&\text{\x1b}&\color{red}{\text{\x00\x1a}} \to \color{green}{\text{[}}\\
  \text{]\}}&\color{gray}{\text{27}}&\text{]}&\text{\}}&\text{\x1d}&\color{red}{\text{\x00\x1b}} \to \color{green}{\text{]}}\\
  \text{ENTER}&\color{gray}{\text{28}}&\text{\r}&\text{\r}&\text{\n}&\color{red}{\text{\x00\x1c}}\\
  \text{ENTER£}&\color{gray}{\text{28}}&\text{\r}&\text{\r}&\text{\n}&\color{red}{\text{\x00¦}}\\
  \text{LCTRL}&\color{gray}{\text{29}}&&&&\\
  \text{RCTRL£}&\color{gray}{\text{29}}&&&&\\
  \text{A}&\color{gray}{\text{30}}&\text{a}&\text{A}&\text{\x01}&\color{red}{\text{\x00\x1e}} \to \color{green}{\text{a}}\\
  \text{S}&\color{gray}{\text{31}}&\text{s}&\text{S}&\text{\x13}&\color{red}{\text{\x00\x1f}} \to \color{green}{\text{s}}\\
  \text{D}&\color{gray}{\text{32}}&\text{d}&\text{D}&\text{\x04}&\color{red}{\text{\x00 }} \to \color{green}{\text{d}}\\
  \text{F}&\color{gray}{\text{33}}&\text{f}&\text{F}&\text{\x06}&\color{red}{\text{\x00!}} \to \color{green}{\text{f}}\\
  \text{G}&\color{gray}{\text{34}}&\text{g}&\text{G}&\text{\x07}&\color{red}{\text{\x00"}} \to \color{green}{\text{g}}\\
  \text{H}&\color{gray}{\text{35}}&\text{h}&\text{H}&\text{\x08}&\color{red}{\text{\x00#}} \to \color{green}{\text{h}}\\
  \text{J}&\color{gray}{\text{36}}&\text{j}&\text{J}&\text{\n}&\color{red}{\text{\x00\$}} \to \color{green}{\text{j}}\\
  \text{K}&\color{gray}{\text{37}}&\text{k}&\text{K}&\text{\x0b}&\color{red}{\text{\x00%}} \to \color{green}{\text{k}}\\
  \text{L}&\color{gray}{\text{38}}&\text{l}&\text{L}&\text{\x0c}&\color{red}{\text{\x00&}} \to \color{green}{\text{l}}\\

\end{array}
$$


$$
\begin{array}{l|r|l|l|l|l}
  \textrm{Name} &
  \textrm{Scan Code} &
  \textrm{Base} &
  \textrm{Shift} &
  \textrm{Ctrl} &
  \textrm{Alt} \\
  \hline
  
  \text{;:}&\color{gray}{\text{39}}&\text{;}&\text{:}&&\color{red}{\text{\x00'}} \to \color{green}{\text{;}}\\
  \text{'"}&\color{gray}{\text{40}}&\text{'}&\text{"}&&\color{red}{\text{\x00(}} \to \color{green}{\text{'}}\\
  \text{`~}&\color{gray}{\text{41}}&\text{`}&\text{~}&&\color{red}{\text{\x00)}} \to \color{green}{\text{`}}\\
  \text{L SHIFT}&\color{gray}{\text{42}}&&&&\\
  \text{\\|}&\color{gray}{\text{43}}&\text{\\}&\text{|}&\text{\x1c}&\color{green}{\text{\\}}\\
  \text{Z}&\color{gray}{\text{44}}&\text{z}&\text{Z}&\text{\x1a}&\color{red}{\text{\x00,}} \to \color{green}{\text{z}}\\
  \text{X}&\color{gray}{\text{45}}&\text{x}&\text{X}&\text{\x18}&\color{red}{\text{\x00-}} \to \color{green}{\text{x}}\\
  \text{C}&\color{gray}{\text{46}}&\text{c}&\text{C}&\text{\x03}&\color{red}{\text{\x00.}} \to \color{green}{\text{c}}\\
  \text{V}&\color{gray}{\text{47}}&\text{v}&\text{V}&\text{\x16}&\color{red}{\text{\x00/}} \to \color{green}{\text{v}}\\
  \text{B}&\color{gray}{\text{48}}&\text{b}&\text{B}&\text{\x02}&\color{red}{\text{\x000}} \to \color{green}{\text{b}}\\
  \text{N}&\color{gray}{\text{49}}&\text{n}&\text{N}&\text{\x0e}&\color{red}{\text{\x001}} \to \color{green}{\text{n}}\\
  \text{M}&\color{gray}{\text{50}}&\text{m}&\text{M}&\text{\r}&\color{red}{\text{\x002}} \to \color{green}{\text{m}}\\
  \text{,<}&\color{gray}{\text{51}}&\text{,}&\text{<}&&\color{red}{\text{\x003}} \to \color{green}{\text{,}}\\
  \text{.>}&\color{gray}{\text{52}}&\text{.}&\text{>}&&\color{red}{\text{\x004}} \to \color{green}{\text{.}}\\
  \text{/?}&\color{gray}{\text{53}}&\text{/}&\text{?}&&\color{red}{\text{\x005}} \to \color{green}{\text{/}}\\
  \text{GRAY/£}&\color{gray}{\text{53}}&\color{gray}{\text{/}}&\color{gray}{\text{?}}&\color{gray}{\text{\x00\x95}}&\color{gray}{\text{\x00¤}}\\
  \text{R SHIFT}&\color{gray}{\text{54}}&&&&\\
  \text{PRISC}&\color{gray}{\text{55}}&\color{gray}{\text{*}}&\color{gray}{\text{PRISC}}&\color{gray}{\text{\x10}}&\\
  \text{L ALT}&\color{gray}{\text{56}}&&&&\\
  \text{R ALT£}&\color{gray}{\text{57}}&&&&\\
  \text{SPACE}&\color{gray}{\text{57}}&\text{ }&\text{ }&\text{ }&\color{red}{\text{ }}\\
  \text{CAPS}&\color{gray}{\text{58}}&&&&\\
  \text{F1}&\color{gray}{\text{59}}&\text{\x00;}&\text{\x00T}&\text{\x00^}&\text{\x00h}\\
  \text{F2}&\color{gray}{\text{60}}&\text{\x00<}&\text{\x00U}&\text{\x00_}&\text{\x00i}\\
  \text{F3}&\color{gray}{\text{61}}&\text{\x00=}&\text{\x00V}&\text{\x00`}&\text{\x00j}\\
  \text{F4}&\color{gray}{\text{62}}&\text{\x00>}&\text{\x00W}&\text{\x00a}&\text{\x00k}\\
  \text{F5}&\color{gray}{\text{63}}&\text{\x00?}&\text{\x00X}&\text{\x00b}&\text{\x00l}\\
  \text{F6}&\color{gray}{\text{64}}&\text{\x00@}&\text{\x00Y}&\text{\x00c}&\text{\x00m}\\
  \text{F7}&\color{gray}{\text{65}}&\text{\x00A}&\text{\x00Z}&\text{\x00d}&\text{\x00n}\\
  \text{F8}&\color{gray}{\text{66}}&\text{\x00B}&\text{\x00[}&\text{\x00e}&\text{\x00o}\\
  \text{F9}&\color{gray}{\text{67}}&\text{\x00C}&\text{\x00\\}&\text{\x00f}&\text{\x00p}\\
  \text{F10}&\color{gray}{\text{68}}&\text{\x00D}&\text{\x00]}&\text{\x00g}&\text{\x00q}\\
  \text{F11£}&\color{gray}{\text{87}}&\text{à\x85}&\text{à\x87}&\text{à\x89}&\text{à\x8b}\\
  \text{F12£}&\color{gray}{\text{88}}&\text{à\x86}&\text{à\x88}&\text{à\x8a}&\text{à\x8c}\\
  \text{NUM}&\color{gray}{\text{69}}&&&&\\
  \text{HOME}&\color{gray}{\text{71}}&\text{\x00G}&\color{red}{\text{7}}&\text{\x00w}&\\
  &&\color{green}{\text{7}}&\color{green}{\text{\x00G}}&\color{green}{\text{\x00w}}&\\
  \text{HOME£}&\color{gray}{\text{71}}&\text{àG}&\text{àG}&\text{àw}&\text{\x00\x97}\\
  \text{UP}&\color{gray}{\text{72}}&\text{\x00H}&\color{red}{\text{8}}&\text{\x00\x8d}&\\
  &&\color{green}{\text{8}}&\color{green}{\text{\x00H}}&\color{green}{\text{\x00\x8d}}&\\

\end{array}
$$


$$
\begin{array}{l|r|l|l|l|l}
  \textrm{Name} &
  \textrm{Scan Code} &
  \textrm{Base} &
  \textrm{Shift} &
  \textrm{Ctrl} &
  \textrm{Alt} \\
  \hline
  
  \text{UP£}&\color{gray}{\text{72}}&\text{àH}&\text{àH}&\text{à\x8d}&\text{\x00\x98}\\
  \text{PGUP}&\color{gray}{\text{73}}&\text{\x00I}&\color{red}{\text{9}}&\text{\x00\x84}&\color{red}{\text{\x00\x99}}\\
  &&\color{green}{\text{9}}&\color{green}{\text{\x00I}}&\color{green}{\text{\x00\x84}}&\\
  \text{PGUP£}&\color{gray}{\text{73}}&\text{àI}&\text{àI}&\color{red}{\text{à\x84}} \to \color{green}{\text{à\x86}}&\text{\x00\x99}\\
  \text{GRAY-}&\color{gray}{\text{74}}&&\color{gray}{\text{-}}&&\\
  \text{LEFT}&\color{gray}{\text{75}}&\text{\x00K}&\color{red}{\text{4}}&\text{\x00s}&\\
  &&\color{green}{\text{4}}&\color{green}{\text{\x00K}}&\color{green}{\text{\x00s}}&\\
  \text{LEFT£}&\color{gray}{\text{75}}&\text{àK}&\text{àK}&\text{às}&\text{\x00\x9b}\\
  \text{CENTER}&\color{gray}{\text{76}}&&\color{red}{\text{5}}&&\\
  &&\color{green}{\text{5}}&&&\\
  \text{RIGHT}&\color{gray}{\text{77}}&\text{\x00M}&\color{red}{\text{6}}&\text{\x00t}&\\
  &&\color{green}{\text{6}}&\color{green}{\text{\x00M}}&\color{green}{\text{\x00t}}&\\
  \text{RIGHT£}&\color{gray}{\text{77}}&\text{àM}&\text{àM}&\text{àt}&\text{\x00\x9d}\\
  \text{GRAY+}&\color{gray}{\text{78}}&&\color{gray}{\text{+}}&&\\
  \text{END}&\color{gray}{\text{79}}&\text{\x00O}&\color{red}{\text{1}}&\text{\x00u}&\\
  &&\color{green}{\text{1}}&\color{green}{\text{\x00O}}&\color{green}{\text{\x00u}}&\\
  \text{END£}&\color{gray}{\text{79}}&\text{àO}&\text{àO}&\text{àu}&\text{\x00\x9f}\\
  \text{DOWN}&\color{gray}{\text{80}}&\text{\x00P}&\color{red}{\text{2}}&\text{\x00\x91}&\\
  &&\color{green}{\text{2}}&\color{green}{\text{\x00P}}&\color{green}{\text{\x00\x91}}&\\
  \text{DOWN£}&\color{gray}{\text{80}}&\text{àP}&\text{àP}&\text{à\x91}&\text{\x00\xa0}\\
  \text{PGDN}&\color{gray}{\text{81}}&\text{\x00Q}&\color{red}{\text{3}}&\text{\x00v}&\\
  &&\color{green}{\text{3}}&\color{green}{\text{\x00Q}}&\color{green}{\text{\x00v}}&\\
  \text{PGDN£}&\color{gray}{\text{81}}&\text{àQ}&\text{àQ}&\text{àv}&\text{\x00¡}\\
  \text{INS}&\color{gray}{\text{82}}&\text{\x00R}&\color{red}{\text{0}}&\text{\x00\x92}&\\
  &&\color{green}{\text{0}}&\color{green}{\text{\x00R}}&\color{green}{\text{\x00\x92}}&\\
  \text{INS£}&\color{gray}{\text{82}}&\text{àR}&\text{àR}&\text{à\x92}&\text{\x00¢}\\
  \text{DEL}&\color{gray}{\text{83}}&\text{\x00S}&\color{red}{\text{.}}&\text{\x00\x93}&\\
  &&\color{green}{\text{.}}&\color{green}{\text{\x00S}}&\color{green}{\text{\x00\x93}}&\\
  \text{DEL£}&\color{gray}{\text{83}}&\text{àS}&\text{àS}&\text{à\x93}&\text{\x00£}\\

\end{array}
$$
...