Speccy - наш выбор!

Speccy - наш выбор! (http://zx-pk.ru/index.php)
-   Эмуляторы отечественных компьютеров (http://zx-pk.ru/forumdisplay.php?f=61)
-   -   Эмулятор УКНЦ (http://zx-pk.ru/showthread.php?t=6257)

Alex_K 18th October 2011 13:56

Quote:

Originally Posted by Titus (Post 425804)
Я опрашиваю в своих эмуляторах клавиатуру через DirectInput, функция GetDeviceState(), и там прекрасно различаются оба Enter-а. Главный имеет код DIK_RETURN, а который на дополнительном нумпаде - DIK_NUMPADENTER.

Так ведь это же надо DirectX использовать. Лучше пока без этих наворотов.

---------- Post added at 12:56 ---------- Previous post was at 12:54 ----------

Quote:

Originally Posted by Titus (Post 425804)
Я опрашиваю в своих эмуляторах ...

Надеюсь свой эмулятор УКНЦ тоже пишите?

Titus 18th October 2011 13:57

Quote:

Originally Posted by Alex_K (Post 425807)
Так ведь это же надо DirectX использовать. Лучше пока без этих наворотов.

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

---------- Post added at 12:57 ---------- Previous post was at 12:56 ----------

Quote:

Originally Posted by Alex_K (Post 425807)
Надеюсь свой эмулятор УКНЦ тоже пишите?

Да, ну легкотня) Вот спектрум - это сложнее)))

Patron 18th October 2011 14:14

Я в своём эмуляторе терминала разбираю скан-коды клавиш:
Code:

                case WM_SYSKEYDOWN:
                {
                        word uScan = HIWORD(lParam);
                        uScan &= 0x1FF;

Code:

                case WM_KEYDOWN:
                {
                        word uScan = HIWORD(lParam);
                        uScan &= 0x1FF;

У главной клавиши <Enter> код 28, у <NumPadEnter> код 284.

Хук нужен только для передачи окну скан-кодов клавиш VK_LWIN, VK_RWIN, VK_APPS, VK_SNAPSHOT и VK_NUMLOCK и отмены (при необходимости) передачи этих кодов в драйвер клавиатуры Windows. Скан-коды всех остальных клавиш передаются через сообщения WM_KEYDOWN и WM_SYSKEYDOWN совершенно стандартно.

Alex_K 18th October 2011 14:37

Quote:

Originally Posted by Patron (Post 425820)
Я в своём эмуляторе терминала разбираю скан-коды клавиш:
case WM_SYSKEYDOWN:
case WM_KEYDOWN:
У главной клавиши <Enter> код 28, у <NumPadEnter> код 284.

Patron, в ранних версиях было также. Там в коде остались даже закомментированные места с использованием WM_KEYDOWN и WM_KEYUP. Но с УКНЦ тут есть некоторые моменты. Клавиатура передает как коды отжатия, так и нажатия, тем более скэн-коды, преобразование в КОИ-8 уже производится в драйвере клавиатуры в системном ПЗУ. Соответственно, если эмулятор получил по WM_KEYDOWN код клавиши, потом пропал фокус ввода, а клавишу отжали, то уже события WM_KEYUP не придет. Сама клавиша западёт в автоповтор в драйвере системного ПЗУ. А при использовании GetKeyboardState при получении фокуса клавиша не будет нажата и клавиатура в эмуляторе уже получит код отжатия.
Так же в УКНЦ клавиатура работает в режиме опроса, по 64 мкс на каждую клавишу, всего 128 клавиш. Получил таблицу, установил виртуальную матрицу в УКНЦ, и особо думать не надо.
Если же эмулировать 15ИЭ-00-013, то да, здесь я согласен - использовать WM_KEYDOWN значительно удобнее. Т.к. 15ИЭ-00-013 всё-таки терминал, то и проблема удобной раскладки решается легко.

Titus 18th October 2011 15:02

Quote:

Originally Posted by Alex_K (Post 425827)
А при использовании GetKeyboardState при получении фокуса клавиша не будет нажата и клавиатура в эмуляторе уже получит код отжатия.

В чем проблема? Если окно потеряло фокус, всем клавишам дается команда 'отжать'.

Alex_K 18th October 2011 15:03

Quote:

Originally Posted by Titus (Post 425837)
В чем проблема? Если окно потеряло фокус, всем клавишам дается команда 'отжать'.

А если осталась нажатая?

Titus 18th October 2011 15:06

Quote:

Originally Posted by Alex_K (Post 425838)
А если осталась нажатая?

Как вы себе представляете потерю фокуса с нажатой клавишей?
Держу клавишу, и нажимаю мышкой на другое окно? В любом случае, плохого ничего не будет, если клавиша отожмется, хотя она осталась нажатой на самом деле.

Patron 18th October 2011 15:21

Quote:

Originally Posted by Alex_K (Post 425838)
А если осталась нажатая?

Если при потере фокуса эмулятор эмулирует отжатие всех клавиш - это совершенно логично и абсолютно безопасно ( побочных эффектов быть не может ).

Alex_K 18th October 2011 16:44

Quote:

Originally Posted by Titus (Post 425839)
Как вы себе представляете потерю фокуса с нажатой клавишей?
Держу клавишу, и нажимаю мышкой на другое окно? В любом случае, плохого ничего не будет, если клавиша отожмется, хотя она осталась нажатой на самом деле.

Всякое может быть, какое-нибудь pop-up окно выскочет.
Quote:

Originally Posted by Patron (Post 425846)
Если при потере фокуса эмулятор эмулирует отжатие всех клавиш - это совершенно логично и абсолютно безопасно ( побочных эффектов быть не может ).

Спасибо всем за советы! Но пока пусть останется, как есть. Эмулировать отжатие клавиш сейчас довольно просто - надо только очистить матрицу клавиш, соответственно вслед за этим придут все кода отжатия, которые нужны.

Titus 18th October 2011 17:23

Quote:

Originally Posted by Alex_K (Post 425877)
Всякое может быть, какое-нибудь pop-up окно выскочет.

Спасибо всем за советы! Но пока пусть останется, как есть. Эмулировать отжатие клавиш сейчас довольно просто - надо только очистить матрицу клавиш, соответственно вслед за этим придут все кода отжатия, которые нужны.

Вообще странно, всегда делают, что программа реагирует на клавиши только если окно в фокусе. И само собой очевидно, что надо их всех отпускать при потери оного.


All times are GMT +4. The time now is 02:54.

Powered by vBulletin® Version 3.8.3
Copyright ©2000 - 2014, Jelsoft Enterprises Ltd.