Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 69

/ вопрос открыт /

Возможно ли в Windows XP програмно включить/отключить индикатор CAPS LOCK, NUM LOCK или Scroll Lock.
Функция SetKeyboardState работает только в Windows 98.

Иван-488 Вопрос ожидает решения (принимаются ответы, доступен мини-форум)

Вопрос задал: Иван-488 (статус: Посетитель)
Вопрос отправлен: 28 июня 2006, 19:26
Состояние вопроса: открыт, ответов: 2.

Ответ #1. Отвечает эксперт: Yurchik

Здравствуйте, Иван!
Судя по описанию функции SetKeyboardState в MSDN, она не будет работать с клавишами CAPS LOCK, NUM LOCK или Scroll Lock даже в Win98. Вместо этой функции следует использовать функцию SendInput(). Вот примерчик. При необходимости можно контролировать возращаемое функцией SendInput значение: если оно равно нулю, какой-то другой поток заблокировал ввод.

Приложение:
  1. procedure TForm1.Button6Click(Sender: TObject);
  2. var
  3. inp: TInput;
  4. begin
  5. ZeroMemory(@inp, SizeOf(inp));
  6. with inp, inp.ki do
  7. begin
  8. Itype:= INPUT_KEYBOARD;
  9. wVk:= VK_NUMLOCK; // VK_NUMLOCK or VK_SCROLL or VK_CAPITAL or any other key...
  10. end;
  11.  
  12. inp.ki.dwFlags:= KEYEVENTF_KEYUP;
  13.  
  14. end;


Ответ отправил: Yurchik (статус: 3-ий класс)
Время отправки: 29 июня 2006, 01:00

Ответ #2. Отвечает эксперт: Виталий Лещенко

Здравствуйте, Иван!
Вот вам пример "мигания" индикаторами.
imho довольно простой код, но если что...

Приложение:
  1. uses Windows;
  2. {$AppType Console}
  3. type
  4. TKeyType = (ktCapsLock, ktNumLock, ktScrollLock);
  5.  
  6. procedure SetLedState(KeyCode: TKeyType; bOn: Boolean);
  7. var
  8. Code: Byte;
  9. begin
  10. code := 0;
  11. case KeyCode of
  12. ktScrollLock: Code := VK_SCROLL;
  13. ktCapsLock: Code := VK_CAPITAL;
  14. ktNumLock: Code := VK_NUMLOCK;
  15. end;
  16. if (GetKeyState(Code) and 1 <> 0) xor bOn then
  17. begin
  18. keybd_event(Code, MapVirtualKey(Code, 0), KEYEVENTF_EXTENDEDKEY, 0);
  19. keybd_event(Code, MapVirtualKey(Code, 0), KEYEVENTF_EXTENDEDKEY or KEYEVENTF_KEYUP, 0);
  20. end;
  21. end;
  22.  
  23. function Ctrl_Handler(Ctrl: Longint): LongBool;
  24. begin
  25. if Ctrl = CTRL_CLOSE_EVENT then
  26. begin
  27. SetLedState(ktNumLock, false);
  28. SetLedState(ktCapsLock, false);
  29. SetLedState(ktScrollLock, false);
  30. WriteLn('Closing...');
  31. halt;
  32. end;
  33. Result := true;
  34. end;
  35.  
  36. var
  37. st: array [0..2] of boolean;
  38. f: boolean;
  39. begin
  40. SetConsoleCtrlHandler(@Ctrl_Handler, True);
  41. st[0] := true;
  42. st[1] := false;
  43. st[2] := false;
  44. repeat
  45. SetLedState(ktNumLock, st[0]);
  46. SetLedState(ktCapsLock, st[1]);
  47. SetLedState(ktScrollLock, st[2]);
  48. sleep(150);
  49. f := st[0];
  50. st[0] := st[1];
  51. st[1] := st[2];
  52. st[2] := f;
  53. until false;
  54. end.
  55.  


Ответ отправил: Виталий Лещенко (статус: 4-ый класс)
Время отправки: 29 июня 2006, 18:29


Мини-форум вопроса

Мини-форум пуст.

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 22 февраля 2025, 11:44
Выполнено за 0.03 сек.