Клавиша NumLock
Подскажите, пожалуйста, как можно программно управлять клавишей NumLock (вкл./выкл.)? Спасибо.
под какой осью?
под Windows 98 и XP.
под 98 вроде можно управлять через порты или через сервисы DOS. под NT сложнее - там через DeviceIoControl. сейчас точно не помню как - дома посмотрю, были исходники.
А в крайнем случает можно через SendInput
Спасибо. Сделала через 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
Я не могу создать массив структур INPUT для передачи в SendInput :( . Помоги, если можешь. Спасибо :) .
тестировалось под Win2000
должно работать так:
{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 | KEYEVENTF_KEYUP, 0);
но, наверно не сработает в Win98
Спасибо, но кнопка действительно остается в "нажатом" состоянии :(. Как обработать KEYEVENTF_KEYUP для 98? Очень бы хотелось :). Может, появятся идеи?
может быть попробовать SendInput с использованием scan code? к сожалению не могу проверить, т.к. в MS VC6 не определена константа KEYEVENTF_SCANCODE.
теоретически это значит, что KEYEVENTF_SCANCODE не предназначена для Win98, но в MSDN про это ничего не написано
Мне посоветовали вариант(кому интересно):
BYTE KeyboardState[ 256 ];
GetKeyboardState( KeyboardState );
KeyboardState[ VK_NUMLOCK ] = KeyboardState[ VK_NUMLOCK ] ^ 1;
SetKeyboardState( KeyboardState );
Работает! Спасибо за помощь и поддержку . :)
//----------------------------------------
Мне посоветовали вариант(кому интересно):
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.
значит работает... под какими виндами?
Использую функцию в двух вариантах(по идеи 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 не понятно. Пока.