Speccy - наш выбор!

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

Titus 31st December 2012 17:53

Quote:

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

Проще говоря - при получении фокуса окном нужно проверить следующие варианты:

1. Установить свой хук сразу ( и проверить успешность его установки ).

2. Установить сначала вместо хука таймер на 50 мс и после получения сигнала таймера - установить хук. Пользователь вряд ли успеет нажать на клавишу быстрее чем через 50 мс после активации окна.

Я пробовал устанавливать хук при получении фокуса окном - не помогает. Наличие активного окна с подключенным директинпутом этот хук игнорирует.

С задержкой не пробовал, но это какие-то дикие костыли.

Не должен директинпут быть кривым.

Попробую инициализировать более новую версию. Ведь у меня используется интерфейс DirectInput, а не, скажем, DirectInput8, для совместимости даже с древними версиями виндовсов и дирекиксов. В принципе, функционал особо в них не менялся, но может древняя версия интерфейса как раз глючная.

Patron 31st December 2012 18:10

Quote:

Originally Posted by Titus (Post 563332)
Наличие активного окна с подключенным директинпутом этот хук игнорирует.

Такое впечатление, что DirectInput оправдывает своё название, отключая обычную обработку нажатий клавиш в Windows..

Тот факт, что хук нормально работает при выходе из окна с DirectInput - позволяет предположить, что когда DirectInput активен - Windows обрабатывает нажатия клавиш совсем не так, как обычно и ( в частности ) глобальные хуки не вызываются вообще.

Titus 31st December 2012 18:19

Quote:

Originally Posted by Patron (Post 563342)
Тот факт, что хук нормально работает при выходе из окна с DirectInput - позволяет предположить, что когда DirectInput активен - Windows обрабатывает нажатия клавиш совсем не так, как обычно и ( в частности ) глобальные хуки не вызываются вообще.

Но ведь системные клавиши работают! Капслоки всякие тоже зажигают лампочки.

Кстати, как управлять этими лампочками? Эмулятор Амиги умеет. Вариант - посылать коды нажатий нумлоков и капслоков через хук - не канает, т.к. это позволяет ИНВЕРТИРОВАТЬ лампочку, но не управлять ей напрямую.

Patron 31st December 2012 20:02

Quote:

Originally Posted by Titus (Post 563346)
это позволяет ИНВЕРТИРОВАТЬ лампочку, но не управлять ей напрямую.

Сначала надо прочитать состояние лампочки (которое отслеживает Windows) и не инвертировать лампочку, если она уже в нужном состоянии:

Code:

void SetCapsLock( bool bState )
{
  BYTE keyState[256];

  GetKeyboardState((LPBYTE)&keyState);

  if( (bState && !(keyState[VK_CAPITAL] & 1)) ||
      (!bState && (keyState[VK_CAPITAL] & 1)) )
  {
  // Simulate a key press
    keybd_event( VK_CAPITAL,
                  0,
                  KEYEVENTF_EXTENDEDKEY | 0,
                  0 );

  // Simulate a key release
    keybd_event( VK_CAPITAL,
                  0,
                  KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP,
                  0);
  }
}



---------- Post added at 18:02 ---------- Previous post was at 17:58 ----------

Quote:

Originally Posted by Titus (Post 563346)
Но ведь системные клавиши работают! Капслоки всякие тоже зажигают лампочки.

DirectX - это подсистема Windows, написанная тем же автором.

Titus 31st December 2012 20:59

Quote:

Originally Posted by Patron (Post 563369)
Сначала надо прочитать состояние лампочки (которое отслеживает Windows) и не инвертировать лампочку, если она уже в нужном состоянии

Т.е. все-таки метода управления ими напрямую нету?
Зато можно читать? Ну и то хорошо.

Но тогда по-любому через хук.

Странно, что он не дружит с директинпутом, тем более написанным авторами Windows.

---------- Post added at 19:26 ---------- Previous post was at 19:20 ----------

Получается, что массив состояния клавиш хранит не состояние CapsLock - нажата / не нажата, а состояние, активирована / не активирована?

---------- Post added at 19:57 ---------- Previous post was at 19:26 ----------

Хм, а вот это меня насторожило:

Quote:

While DirectInput forms a part of the DirectX library, it has not been significantly revised since DirectX 8 (2001–2002). Microsoft recommends that new applications make use of the Windows message loop for keyboard and mouse input instead of DirectInput (as indicated in the Meltdown 2005 slideshow[1]), and to use XInput instead of DirectInput for Xbox 360 controllers.


---------- Post added at 19:59 ---------- Previous post was at 19:57 ----------

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

Patron 31st December 2012 21:01

Quote:

Originally Posted by Titus (Post 563376)
Т.е. все-таки метода управления ими напрямую нету

В смысле, так, чтобы обмануть Windows? Чтобы Windows думала, что лампочка ещё горит, а мы ( хе-хе! ) её уже потушили. А зачем такое может потребоваться..

Выше я привёл код функции управления состоянием лампочки CapsLock. После вызова SetCapsLock(1) лампочка гарантированно будет гореть, а после SetCapsLock(0) - гарантированно гореть НЕ будет. Какие проблемы.. Что ещё надо?

Quote:

Получается, что массив состояния клавиш хранит не состояние CapsLock - нажата / не нажата, а состояние, активирована / не активирована?
В бите 15 хранится [нажата / не нажата], а в бите 0 - [активирована / не активирована] ( позже выяснилось, что это ошибочное утверждение - т.к. в матрице хранятся байты ).

---------- Post added at 19:01 ---------- Previous post was at 18:59 ----------

Quote:

Originally Posted by Titus (Post 563376)
систему сообщений. Эту тормознутую бяку (как я ее считаю).

Ну, миллион сообщений в секунду Windows без проблем пропускает.

Titus 31st December 2012 21:03

Мне директинпут очень нравится. Он быстрый, дает состояние ВСЕХ клавиш быстренько в одном массиве. А так же различает Enter на основной и дополнительной клавиатурах.

Patron 31st December 2012 21:13

Quote:

Originally Posted by Titus (Post 563396)
Мне директинпут очень нравится. Он быстрый, дает состояние ВСЕХ клавиш быстренько в одном массиве. А так же различает Enter на основной и дополнительной клавиатурах.

Code:

  BYTE keyState[256];
  GetKeyboardState((LPBYTE)&keyState);

Даёт одним махом состояние всех клавиш и всех лампочек. Причём, Windows дополнительно поддерживает специальные виртуальные клавиши, отражающие "суммарное" состояние пар контролов, шифтов и альтов.

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

Titus 31st December 2012 21:23

А эта функция относится к чему?
Связана ли она с фокусом окна?
Позволяет ли отличить Enter на основной и доп-клавиатуре?
С какой версии виндовс она появилась?

---------- Post added at 20:23 ---------- Previous post was at 20:16 ----------

Quote:

Originally Posted by Patron (Post 563394)
В бите 15 хранится [нажата / не нажата], а в бите 0 - [активирована / не активирована].

Точно в 15? Массив-то байтовый.

Patron 31st December 2012 21:36

Quote:

Originally Posted by Titus (Post 563401)
А эта функция относится к чему?

GetKeyboardState function (Windows)

Quote:

Связана ли она с фокусом окна?
Функция возвращает матрицу виртуальных клавиш текщего потока, которая по умолчанию совпадает с матрицей виртуальных кавиш Windows, но может локально изменяться вызовами SetKeyboardState.

Quote:

Позволяет ли отличить Enter на основной и доп-клавиатуре?
Список виртуальных клавиш Windows выглядит так Virtual-Key Codes, есть ли там флаг, позволяющий отличить PadEnter - не знаю. Можно написать тест, который будет после каждого нажатия клавиши сравнивать матрицу с предыдущей и показывать отличия. Если у PadEnter нет своего флага - можно научить глобальный хук писать флаг состояния PadEnter в отдельную переменную или в ту же матрицу виртуальных клавиш ( там есть свободные ячейки ).

Quote:

С какой версии виндовс она появилась?
Проклятый Microsift теперь упорно делает вид, будто первой Windows была Windows 2000, поэтому про более ранние версии ничего узнать нельзя.


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

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