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 23:50

Да, я тоже заподозрил там ошибку, но решил, пока сам не разберусь, не говорить)

Попробовал DirectInput8 - все тоже самое, но функционала больше. А так тоже блокирует глобльный хук.

Ну что же, похоже, действительно придется делать хук и в нем формировать массив из клавиш плюс дополнительная клавиша энтера нумпада. Сделаю конвертирование сканкодов VK_ в DIK_, т.к. у меня все заточено под них.

Patron 1st January 2013 01:44

Quote:

Originally Posted by Titus (Post 563456)
придется делать хук и в нем формировать массив из клавиш

Глобальный хук стандартен в модульном API, но на массив клавиш пока стандарта нет - мне этот массив понадобится только в эмуляторе КСМ, делать который я ещё не начал. Поэтому, если есть конструктивные идеи относительно универсального массива клавиш, пригодного для использования в любом эмуляторе - это будет кстати.

Поскольку в модульном API глобальный хук один на все экземпляры программ, использующих этот API - программа не сможет изменять глобальный массив клавиш, а только получать оттуда значения.

Titus 1st January 2013 04:32

И все-таки меня вот ЭТО настараживает:

Quote:

Теперь надо сделать небольшое лирическое отступление от данной темы, для лучшего понятия описываемого механизма. В 32-битных (а далее в 64-битных) операционных системах Windows каждый процесс в системе имеет своё собственное обособленное адресное пространство. Обратиться к чужому адресному пространству можно только через несколько API функций и имея определённые привилегии. Т.е. по одному и тому же адресу в разных процессах могут быть совершенно разные данные. Для того чтобы фильтрующая функция могла обработать сообщение, она должна находиться в памяти именно того процесса, которому принадлежит целевое окно и оконная функция. Итак, если хук устанавливается на всю систему, то фильтрующая функция должна быть загружена в каждый процесс, у которого есть хотя бы один цикл сообщений c использованием функций GetMessage или PeekMessage. Единственный стандартный способ загрузки нашего кода в чужой процесс, это использование DLL. Т.е. для нормального функционирования хуков установленных на всю систему необходимо использовать DLL.

Patron 1st January 2013 05:34

Quote:

Originally Posted by Titus (Post 563507)
И все-таки меня вот ЭТО настараживает:

Чепуха.

Я в этом вопросе собаку съел и в модульном API любой EXE-шник может выступать провайдером глобальной таблицы клавиш, доступной всем процессам Windows, использующим модульный API.

Т.е. код глобального хука есть у всех одновременно запущенных EXE-шников модульного API, но в любой момент времени работает только один из этих глобальных хуков, который и обслуживает глобальную таблицу.

Titus 1st January 2013 15:07

Тут, как я понял, имеется в виду другое.
Библиотечная функция имеет адресное пространство, доступное всем процессам. А твой конкретный экзешник, внутри которого код хука, может и не быть доступен другим процессам. Может это зависит от конкретной системы, многоядерности или еще чего. Я с этой стороны Виндовс знаю слабо.

Patron 1st January 2013 15:18

Quote:

Originally Posted by Titus (Post 563567)
конкретный экзешник, внутри которого код хука, может и не быть доступен другим процессам

Это проблемы Windows. В XP и дальше - глобальный хук прекрасно работает из EXE. Т.к. модульный API работоспособен только в среде XP, то если работает API - работает и глобальный хук.

Titus 1st January 2013 15:23

Quote:

Originally Posted by Patron (Post 563569)
Это проблемы Windows. В XP и дальше - глобальный хук прекрасно работает из EXE. Т.к. модульный API работоспособен только в среде XP, то если работает API - работает и глобальный хук.

В общем, это надо попроверять на разных вин-системах, с разными ядрами и многоядерностями. Не с потолка же в MSDN так сказано.

Patron 1st January 2013 15:53

1 Attachment(s)
Quote:

Originally Posted by Titus (Post 563570)
это надо попроверять на разных вин-системах

Вот консольный вариант хук-теста.

Запускаем, переходим в окно блокнота, давим все кнопки подряд и радуемся.

...

hobot 1st January 2013 17:39

Quote:

Запускаем,
Что то не вышло у меня с запуском на ноуте! )

http://savepic.ru/3740038.png

http://savepic.ru/3796377.png

Patron 1st January 2013 19:21

Quote:

Originally Posted by hobot (Post 563603)
Что то не вышло у меня с запуском на ноуте!

Там резидентный антивирус запрещает глобальные хуки. Нужно "прописать" там тест так же, как "эмулятор ДВК", который на этом ноуте тоже пришлось с бубном запускать.


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

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