| 
| 
 | Вопрос # 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
 
 |  
 Мини-форум вопросаМини-форум пуст. Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте. |