netch80: (Default)
[personal profile] netch80
Есть виндовый лаптоп с 10кой. Как это принято у производителей лаптопов, в центре правой части стандартный numpad. Регулярно возникает ситуация типа нажимаешь Shift+PgUp - получаешь 9. Клавиши стрелочного блока есть, кроме Insert (злобный хьюлетт не сделал её даже как Fn+Del, хотя что им стоило), но расположены неудобно и непривычно. Диверсанты однако.
Поставил вопрос: хочу устранить логику "при NumLock=off, Shift+клавиша даёт цифру" (включая точку для Del).

Смотрел на Keyboard Layout Creator от MS - numpad там вообще не задействован. Смотрю в утёкшие файлы конфигурации стандартных раскладок - там эта часть вообще не настраивается. Похоже, логика стандартизована где-то в общем коде, не зависящем от раскладки :(

Попытался подвеситься на WH_KEYBOARD_LL. И тут оказалось, что не всё просто. Home стрелочного блока и Home цифрового блока даёт одинаково 36 (VK_HOME) при numlock=off. Home цифрового блока даёт 103 (VK_NUMPAD7) при numlock=on. Во flags таки младший бит даёт различие между двумя клавишами. Итого вариант, который вроде работает (проверил вживую): если вижу одну из 10 клавиш (центральная 5 не в счёт) и flags&1==0, ставлю 1 в младший бит flags и передаю дальше. Похоже на правду.

В Linux реализация заняла несколько строчек в конфиге, а тут - извращаться. Но победил.

Попутный вопрос: почему эта центральная 5 - VK_CLEAR в Windows и KP_Begin в XFree86? Откуда это и что должно было значить?

Date: 2021-12-04 06:10 pm (UTC)
dadv: (Default)
From: [personal profile] dadv
Я программировать под винду не умею, поэтому подобную проблему когда-то решил мелким скриптом под AutoHotKey: https://dadv.livejournal.com/204046.html

KP_Begin это одна из множества клавиш набора KP_*:

keycode 0x3F = KP_Multiply
keycode 0x4F = KP_Home
keycode 0x50 = KP_Up
keycode 0x51 = KP_Prior (PageUp)
keycode 0x52 = KP_Subtract
keycode 0x53 = KP_Left
keycode 0x54 = KP_Begin
keycode 0x55 = KP_Right
keycode 0x56 = KP_Add
keycode 0x57 = KP_End
keycode 0x58 = KP_Down
keycode 0x59 = KP_Next (PageDown)
keycode 0x5A = KP_Insert
keycode 0x5B = KP_Delete
keycode 0x6C = KP_Enter
keycode 0x70 = KP_Divide

KP_Begin сидит аккурат между KP_Left и KP_Right.
Edited Date: 2021-12-04 06:11 pm (UTC)

Date: 2021-12-04 06:21 pm (UTC)
dadv: (Default)
From: [personal profile] dadv
Что касается VK_CLEAR, то гугль говорит, что это пошло с эмуляции терминалов, имевших отдельную клавишу CLEAR для очистки текущей строки.

Date: 2021-12-04 07:03 pm (UTC)
dadv: (Default)
From: [personal profile] dadv
Шибко авторитетных ссылок нет, но вот например: https://country.honeywellaidc.com/CatalogDocuments/934-049.pdf

Ещё "CLEAR Key" упоминается тут: http://index-of.es/Programming/Assembly/Windows%20assembly%20language%20and%20systems%20programming%201997.pdf
Edited Date: 2021-12-04 07:07 pm (UTC)

Profile

netch80: (Default)
netch80

January 2026

S M T W T F S
    1 23
45678910
11121314151617
18192021222324
25262728293031

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Jan. 2nd, 2026 05:02 pm
Powered by Dreamwidth Studios