|
Вопрос # 69/ вопрос открыт / |
|
Возможно ли в Windows XP програмно включить/отключить индикатор CAPS LOCK, NUM LOCK или Scroll Lock.
Функция SetKeyboardState работает только в Windows 98.
 |
Вопрос задал: Иван-488 (статус: Посетитель)
Вопрос отправлен: 28 июня 2006, 19:26
Состояние вопроса: открыт, ответов: 2.
|
Ответ #1. Отвечает эксперт: Yurchik
Здравствуйте, Иван!
Судя по описанию функции SetKeyboardState в MSDN, она не будет работать с клавишами CAPS LOCK, NUM LOCK или Scroll Lock даже в Win98. Вместо этой функции следует использовать функцию SendInput(). Вот примерчик. При необходимости можно контролировать возращаемое функцией SendInput значение: если оно равно нулю, какой-то другой поток заблокировал ввод.
Приложение: Переключить в обычный режим- procedure TForm1.Button6Click(Sender: TObject);
- var
- inp: TInput;
- begin
- ZeroMemory(@inp, SizeOf(inp));
- with inp, inp.ki do
- begin
- Itype:= INPUT_KEYBOARD;
- wVk:= VK_NUMLOCK; // VK_NUMLOCK or VK_SCROLL or VK_CAPITAL or any other key...
- end;
-
- inp.ki.dwFlags:= KEYEVENTF_KEYUP;
-
- end;
 |
Ответ отправил: Yurchik (статус: 3-ий класс)
Время отправки: 29 июня 2006, 01:00
|
Ответ #2. Отвечает эксперт: Виталий Лещенко
Здравствуйте, Иван!
Вот вам пример "мигания" индикаторами.
imho довольно простой код, но если что...
Приложение: Переключить в обычный режим- uses Windows;
- {$AppType Console}
- type
- TKeyType = (ktCapsLock, ktNumLock, ktScrollLock);
-
- procedure SetLedState(KeyCode: TKeyType; bOn: Boolean);
- var
- Code: Byte;
- begin
- code := 0;
- case KeyCode of
- ktScrollLock: Code := VK_SCROLL;
- ktCapsLock: Code := VK_CAPITAL;
- ktNumLock: Code := VK_NUMLOCK;
- end;
- if (GetKeyState(Code) and 1 <> 0) xor bOn then
- begin
- keybd_event(Code, MapVirtualKey(Code, 0), KEYEVENTF_EXTENDEDKEY, 0);
- keybd_event(Code, MapVirtualKey(Code, 0), KEYEVENTF_EXTENDEDKEY or KEYEVENTF_KEYUP, 0);
- end;
- end;
-
- function Ctrl_Handler(Ctrl: Longint): LongBool;
- begin
- if Ctrl = CTRL_CLOSE_EVENT then
- begin
- SetLedState(ktNumLock, false);
- SetLedState(ktCapsLock, false);
- SetLedState(ktScrollLock, false);
- WriteLn('Closing...');
- halt;
- end;
- Result := true;
- end;
-
- var
- st: array [0..2] of boolean;
- f: boolean;
- begin
- SetConsoleCtrlHandler(@Ctrl_Handler, True);
- st[0] := true;
- st[1] := false;
- st[2] := false;
- repeat
- SetLedState(ktNumLock, st[0]);
- SetLedState(ktCapsLock, st[1]);
- SetLedState(ktScrollLock, st[2]);
- sleep(150);
- f := st[0];
- st[0] := st[1];
- st[1] := st[2];
- st[2] := f;
- until false;
- end.
-
 |
Ответ отправил: Виталий Лещенко (статус: 4-ый класс)
Время отправки: 29 июня 2006, 18:29
|
Мини-форум вопроса
Мини-форум пуст.
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|