Модераторы: Snowy, bartram, MetalFan, bems, Poseidon, Riply
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Помигать диодами NumLock, CapsLock... Реализация через порт клавиатуры... 
V
    Опции темы
NUCLEuS
Дата 8.4.2006, 18:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 45
Регистрация: 12.7.2005

Репутация: нет
Всего: нет



Привет всем!

Интересует как можно помигать диодами NUM_LOCK, CAPS_LOCK, SCROLL_LOCK. НО, реализовать это нужно через порт клавиатуры, а не с помощью Post/Send message. Т.е. на самом низком уровне. Вот. Буду очень благодарен, если кто нибудь сможет помочь.
Спасибо.


M
Girder
Поиск... http://forum.vingrad.ru/index.php?act=Search&f=2
Совсем не давно обсуждалось!

PM MAIL   Вверх
Poseidon
Дата 8.4.2006, 18:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Delphi developer
****


Профиль
Группа: Комодератор
Сообщений: 5273
Регистрация: 4.2.2005
Где: Гомель, Беларусь

Репутация: 10
Всего: 133



Способ для 9x (на NT не работает):
Код

var 
 KeyState : TKeyboardState; 
begin 
 GetKeyboardState(KeyState); 
 KeyState[VK_SCROLL] := KeyState[VK_SCROLL] xor 1; 
 KeyState[VK_CAPITAL] := KeyState[VK_CAPITAL] xor 1; 
 KeyState[VK_NUMLOCK] := KeyState[VK_NUMLOCK] xor 1; 
 SetKeyboardState (KeyState); 
end;  


Способ для NT (на 9x не работает):
Код

begin 
  keybd_event (VK_SCROLL, 0, KEYEVENTF_EXTENDEDKEY, 0); 
  keybd_event (VK_SCROLL, 0, KEYEVENTF_EXTENDEDKEY or KEYEVENTF_KEYUP, 0); 

  keybd_event (VK_CAPITAL, 0, KEYEVENTF_EXTENDEDKEY, 0); 
  keybd_event (VK_CAPITAL, 0, KEYEVENTF_EXTENDEDKEY or KEYEVENTF_KEYUP, 0); 

  keybd_event (VK_NUMLOCK, 0, KEYEVENTF_EXTENDEDKEY, 0); 
  keybd_event (VK_NUMLOCK, 0, KEYEVENTF_EXTENDEDKEY or KEYEVENTF_KEYUP, 0); 
end; 



--------------------
Если хочешь, что бы что-то работало - используй написанное, 
если хочешь что-то понять - пиши сам...
PM MAIL ICQ   Вверх
NUCLEuS
Дата 8.4.2006, 23:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 45
Регистрация: 12.7.2005

Репутация: нет
Всего: нет



Poseidon, спасибо конечно, но это что, работа через порт?

Я имею ввиду напрямую smile
Добавлено @ 23:25
Girder
Извини что засоряю форум подобными сообщениями, но поиск не нашёл ничего стоящего...
Мож. это я так искал smile

Это сообщение отредактировал(а) NUCLEuS - 8.4.2006, 23:18
PM MAIL   Вверх
Girder
Дата 9.4.2006, 13:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Лентяй 2
***


Профиль
Группа: Участник Клуба
Сообщений: 1993
Регистрация: 12.5.2004

Репутация: 25
Всего: 155



Цитата(NUCLEuS @ 9.4.2006, 00:18 Найти цитируемый пост)
Я имею ввиду напрямую
А... ты об ентом. Но енто тоже имхо... обсуждалось. Искать лень... так что сделай типо так.

Скачиваеш TDriver(см. прикрепленную тему в ентом разделе)... устанавливаеш его...

Далее типо так:
Код
 Driver1.SetPort($50,$70,true);
 //while (Driver1.PortInOut[$64] and 2 <> 0) do;
 Driver1.PortInOut[$60]:=$ed;
 {0бит - включить светодиод Scroll Lock;
  1бит - включить светодиод Num Lock;
  2бит - включить светодиод Caps Lock;}
 Driver1.PortInOut[$60]:=$2; //включаем Num Lock


PS: Не проверял...


--------------------
Как слышим, так и пишим.
Истина где-то там...
PM   Вверх
NUCLEuS
Дата 10.4.2006, 00:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 45
Регистрация: 12.7.2005

Репутация: нет
Всего: нет



Girder, спасибо тебе большое smile Щас проверю.
PM MAIL   Вверх
NUCLEuS
Дата 10.4.2006, 00:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 45
Регистрация: 12.7.2005

Репутация: нет
Всего: нет



Girder,
проверил - не работает smile

Вылетает на

Driver1.PortInOut[$60]:=$ed;

Если убрать эту строку, то вылетает на следующей (Driver1.PortInOut[$60]:=$2;).
Говорит

External exeption C0000008

Поправка : посмотрел в отладчике - вылет происходит из-за SetPort функции... А если её вызов убрать то будет Error : Privileged instruction. (как я понял эта функция может открывать порты I/O в NT (а я чёт думал что тут без ring0 не обойтись smile ))

Что тут можно сделать?
PM MAIL   Вверх
Girder
Дата 10.4.2006, 09:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Лентяй 2
***


Профиль
Группа: Участник Клуба
Сообщений: 1993
Регистрация: 12.5.2004

Репутация: 25
Всего: 155



Цитата(NUCLEuS @ 10.4.2006, 01:18 Найти цитируемый пост)
Если убрать эту строку, то вылетает на следующей (Driver1.PortInOut[$60]:=$2;).
Говорит

External exeption C0000008
Просто жми F9 smile ... енто же исключение обрабатывается внутри компонента smile . Если тебе енто раздражает... то просто запускай не из под Delphi smile

Цитата(NUCLEuS @ 10.4.2006, 01:18 Найти цитируемый пост)
проверил - не работает

Ну просто там нету задержи... или к примеру можно сделать проверку занятости... т.е. вот так:
Код
 Driver1.SetPort($60,$70,true);
 while (Driver1.PortInOut[$64] and 2 <> 0) do;
 Driver1.PortInOut[$60]:=$ed;
 while (Driver1.PortInOut[$64] and 2 <> 0) do;
 Driver1.PortInOut[$60]:=$2; //Num Lock


PS: Проверил... работает smile Ты только NumLock отключи... так как енто я сделал "зажигание" его smile


--------------------
Как слышим, так и пишим.
Истина где-то там...
PM   Вверх
NUCLEuS
Дата 10.4.2006, 14:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 45
Регистрация: 12.7.2005

Репутация: нет
Всего: нет



Girder, да, работает, спасибо smile

Но мне как всегда хочется всё сделать самому и на самом низком уровне smile

Поэтому начал разбирать твой компонент и понял что без ring0 тут всё таки не обошлось smile
Насколько я понял, ты загнал свой ring0 драйвер в массив (gwiopm_sys) я подумал что это драйвер потому что первые байты 4D 5A (MZ) как раз PE заголовка. smile Классный способ, я даже и не думал что так можно сделать smile

Так вот, это уже Off Topic, но мне очень интересно, как ты написал этот самый драйвер, очень хочется увидеть исходник, я тоже хочу научиться писать ring0 драйвера... И интересно как твой драйвер функционирует? Просто даёт вызвавшему приложению ring0 права? Интересно очень...


И, если можешь, дай пожалуйста исходник этого драйвера smile
PM MAIL   Вверх
Girder
Дата 10.4.2006, 14:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Лентяй 2
***


Профиль
Группа: Участник Клуба
Сообщений: 1993
Регистрация: 12.5.2004

Репутация: 25
Всего: 155





--------------------
Как слышим, так и пишим.
Истина где-то там...
PM   Вверх
NUCLEuS
Дата 10.4.2006, 14:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 45
Регистрация: 12.7.2005

Репутация: нет
Всего: нет



Girder,
ок,почитаю smile

А можешь объяснить эти строчки кода

Код

Driver1.SetPort($50,$70,true);


Start Port = $50
End Port = $70

Это ты разрешаешь работу с портами от $50 до $70 вызывающему приложению? Или не так smile

Код

Driver1.PortInOut[$60]:=$ed;


Это тоже непонятно ты посылаешь на порт $60 (кстати, почему $60?) 11101101, зачем?
PM MAIL   Вверх
Girder
Дата 10.4.2006, 15:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Лентяй 2
***


Профиль
Группа: Участник Клуба
Сообщений: 1993
Регистрация: 12.5.2004

Репутация: 25
Всего: 155



1. Вообще-то в TDriver-е енто написано... что делает ента функция.
PS: Модифицируется карта разрешения ввода-вывода.

2. енто команда... Set/Reset Mode Indicators


--------------------
Как слышим, так и пишим.
Истина где-то там...
PM   Вверх
NUCLEuS
Дата 10.4.2006, 19:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 45
Регистрация: 12.7.2005

Репутация: нет
Всего: нет



Ок, огромное спасибо за всю информацию что ты мне дал smile

Это сообщение отредактировал(а) NUCLEuS - 10.4.2006, 19:40
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: WinAPI и системное программирование"
Snowybartram
MetalFanbems
PoseidonRrader
Riply

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Delphi обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • 99% ответов по WinAPI можно найти в MSDN Library, оставшиеся 1% здесь

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, bartram, MetalFan, bems, Poseidon, Rrader, Riply.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: WinAPI и системное программирование | Следующая тема »


 




[ Время генерации скрипта: 0.0570 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.