Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Клавиша NumLock

2.4K
16 февраля 2004 года
Belka
23 / / 05.08.2003
Подскажите, пожалуйста, как можно программно управлять клавишей NumLock (вкл./выкл.)? Спасибо.
401
17 февраля 2004 года
Br@in RIPper
289 / / 15.02.2003
Цитата:
Originally posted by Belka
Подскажите, пожалуйста, как можно программно управлять клавишей NumLock (вкл./выкл.)? Спасибо.



под какой осью?

2.4K
17 февраля 2004 года
Belka
23 / / 05.08.2003
под Windows 98 и XP.
401
18 февраля 2004 года
Br@in RIPper
289 / / 15.02.2003
Цитата:
Originally posted by Belka
под Windows 98 и XP.



под 98 вроде можно управлять через порты или через сервисы DOS. под NT сложнее - там через DeviceIoControl. сейчас точно не помню как - дома посмотрю, были исходники.

А в крайнем случает можно через SendInput

2.4K
19 февраля 2004 года
Belka
23 / / 05.08.2003
Спасибо. Сделала через keybd_event для XP (нашла по help), но для 98 - это не будет работать (так пишут, еще не проверила). К сожалению, с SendInput пока не разобралась, может, пояснишь подробнее? Спасибо .:)
401
19 февраля 2004 года
Br@in RIPper
289 / / 15.02.2003
Цитата:
Originally posted by Belka
Спасибо. Сделала через keybd_event для XP (нашла по help), но для 98 - это не будет работать (так пишут, еще не проверила). К сожалению, с SendInput пока не разобралась, может, пояснишь подробнее? Спасибо .:)



сама функция keybd_event работает на всех виндах, но именно NumLock в Win98, судя по описанию, переключать не может, хотя ScrollLock и CapsLock переключает.
SendInput работает начиная с Win98 - эта функция заменяет собой keybd_event и работает схоже с ней.
Что именно тебе не понятно с SendInput?
на всякий случай: http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winui/winui/windowsuserinterface/userinput/keyboardinput/keyboardinputreference/keyboardinputfunctions/sendinput.asp

2.4K
19 февраля 2004 года
Belka
23 / / 05.08.2003
Я не могу создать массив структур INPUT для передачи в SendInput :( . Помоги, если можешь. Спасибо :) .
401
20 февраля 2004 года
Br@in RIPper
289 / / 15.02.2003
Цитата:
Originally posted by Belka
Я не могу создать массив структур INPUT для передачи в SendInput :( . Помоги, если можешь. Спасибо :) .



тестировалось под Win2000

должно работать так:

 
Код:
INPUT input[2]={
    {INPUT_KEYBOARD, {VK_NUMLOCK, 0, 0, KEYEVENTF_EXTENDEDKEY, 0}},
    {INPUT_KEYBOARD, {VK_NUMLOCK, 0, 0, KEYEVENTF_KEYUP|KEYEVENTF_EXTENDEDKEY, 0}},
};
SendInput(2, input, sizeof(INPUT));


но, судя по всему не обрабатывается KEYEVENTF_KEYUP и кнопка остается в "нажатом" состоянии.

корректно работает
 
Код:
keybd_event( VK_NUMLOCK, 0, KEYEVENTF_EXTENDEDKEY | 0, 0);
keybd_event( VK_NUMLOCK, 0, KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP, 0);

но, наверно не сработает в Win98
2.4K
20 февраля 2004 года
Belka
23 / / 05.08.2003
Спасибо, но кнопка действительно остается в "нажатом" состоянии :(. Как обработать KEYEVENTF_KEYUP для 98? Очень бы хотелось :). Может, появятся идеи?
401
20 февраля 2004 года
Br@in RIPper
289 / / 15.02.2003
Цитата:
Originally posted by Belka
Спасибо, но кнопка действительно остается в "нажатом" состоянии :(. Как обработать KEYEVENTF_KEYUP для 98? Очень бы хотелось :). Может, появятся идеи?



может быть попробовать SendInput с использованием scan code? к сожалению не могу проверить, т.к. в MS VC6 не определена константа KEYEVENTF_SCANCODE.

теоретически это значит, что KEYEVENTF_SCANCODE не предназначена для Win98, но в MSDN про это ничего не написано

2.4K
20 февраля 2004 года
Belka
23 / / 05.08.2003
//----------------------------------------
Мне посоветовали вариант(кому интересно):

BYTE KeyboardState[ 256 ];
GetKeyboardState( KeyboardState );
KeyboardState[ VK_NUMLOCK ] = KeyboardState[ VK_NUMLOCK ] ^ 1;
SetKeyboardState( KeyboardState );

Работает! Спасибо за помощь и поддержку . :)
401
24 февраля 2004 года
Br@in RIPper
289 / / 15.02.2003
Цитата:
Originally posted by Belka
//----------------------------------------
Мне посоветовали вариант(кому интересно):

BYTE KeyboardState[ 256 ];
GetKeyboardState( KeyboardState );
KeyboardState[ VK_NUMLOCK ] = KeyboardState[ VK_NUMLOCK ] ^ 1;
SetKeyboardState( KeyboardState );

Работает! Спасибо за помощь и поддержку . :)



я рассматривал этот вариант, но меня отпугнуло седующее заявление в MSDN:
Because the SetKeyboardState function alters the input state of the calling thread and not the global input state of the system, an application cannot use SetKeyboardState to set the NUM LOCK, CAPS LOCK, or SCROLL LOCK (or the Japanese KANA) indicator lights on the keyboard. These can be set or cleared using SendInput to simulate keystrokes.

значит работает... под какими виндами?

2.4K
27 февраля 2004 года
Belka
23 / / 05.08.2003
Работает, и под 98, и под XP, проверила.
Использую функцию в двух вариантах(по идеи help):
void SetNumLock( BOOL bState ){
BYTE keyState[256];
GetKeyboardState((LPBYTE)&keyState);
if( (bState && !(keyState[VK_NUMLOCK] & 1)) || (!bState && (keyState[VK_NUMLOCK] & 1)) )
{
// для XP
keybd_event( VK_NUMLOCK, 0x45, KEYEVENTF_EXTENDEDKEY | 0, 0 );
keybd_event( VK_NUMLOCK, 0x45, KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP, 0);
// для 98
//keyState[VK_NUMLOCK] = keyState[VK_NUMLOCK]^1;
//SetKeyboardState( keyState );
}
} и в нужный момент вызываю SetNumLock(true).
Правда, в 98-ом еще дополнительно сделала этот вызов в OnCreate для формы, иначе вначале отрабатывает некорректно. Почему так написано в MSDN не понятно. Пока.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог