Форум программистов, компьютерный форум CyberForum.ru

Заставить индикаторы клавиатуры мигать - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 17, средняя оценка - 4.65
Gepar
 Аватар для Gepar
1173 / 529 / 20
Регистрация: 01.07.2009
Сообщений: 3,512
12.05.2011, 10:48     Заставить индикаторы клавиатуры мигать #1
Нужно заставить чтобы индикаторы клавиатуры мигали каждые 10 секунд (это уже я если что сам доделаю), узнал что через winapi это можно сделать и на с++, но знаний языка пока к сожалению недостаточно чтобы это реализовать.
На сайте майкрософт написано как это сделать и есть один рабочий пример
http://msdn.microsoft.com/en-us/libr...(v=vs.85).aspx
, кто разбирается помогите пожалуйста, очень прошу.

Добавлено через 1 минуту
Сам доделаю в смысле что черезе 10 секунд именно

Добавлено через 18 минут
Смог заставить по тому примеру включаться и остальные клавиши, но выключать плохо получается, почему так?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
 #include <windows.h>
 #include <iostream>
 
   void SetNumLock( BOOL bState )
   {
      BYTE keyState[256];
 
      GetKeyboardState((LPBYTE)&keyState);
      if( (bState && !(keyState[VK_NUMLOCK] & 1)) ||
          (!bState && (keyState[VK_NUMLOCK] & 1)) )
      {
      // Simulate a key press
         keybd_event( VK_NUMLOCK,
                      0x45,
                      KEYEVENTF_EXTENDEDKEY | 0,
                      0 );
 
      // Simulate a key release
         keybd_event( VK_NUMLOCK,
                      0x45,
                      KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP,
                      0);
      }
   }
   void SetCapsLock( BOOL bState )
   {
      BYTE keyState[256];
 
      GetKeyboardState((LPBYTE)&keyState);
      if( (bState && !(keyState[VK_CAPITAL] & 1)) ||
          (!bState && (keyState[VK_CAPITAL] & 1)) )
      {
      // Simulate a key press
         keybd_event( VK_CAPITAL,
                      0x45,
                      KEYEVENTF_EXTENDEDKEY | 0,
                      0 );
 
      // Simulate a key release
         keybd_event( VK_CAPITAL,
                      0x45,
                      KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP,
                      0);
      }
   }
 
   void SetScrLock( BOOL bState )
   {
      BYTE keyState[256];
 
      GetKeyboardState((LPBYTE)&keyState);
      if( (bState && !(keyState[VK_SCROLL] & 1)) ||
          (!bState && (keyState[VK_SCROLL] & 1)) )
      {
      // Simulate a key press
         keybd_event( VK_SCROLL,
                      0x45,
                      KEYEVENTF_EXTENDEDKEY | 0,
                      0 );
 
      // Simulate a key release
         keybd_event( VK_SCROLL,
                      0x45,
                      KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP,
                      0);
      }
   }
 
   int main()
   {
      SetNumLock( TRUE );
      SetCapsLock(TRUE);
      SetScrLock (TRUE);
      int a;
      std::cin>>a;
      SetNumLock( FALSE );
      SetCapsLock(FALSE);
      SetScrLock (FALSE);
   }
Если в коде оставить в конце SetScrLock (FALSE) то выключится только scrolLock, а если убрать то выключиться капс и нам лок. Что я сделал смотря на пример не правильно?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
12.05.2011, 10:48     Заставить индикаторы клавиатуры мигать
Посмотрите здесь:

C++ Ввести с клавиатуры массив из N чисел (N также вводится с клавиатуры). Найти наименьший из его положительных элементов.
как заставить С++ и С# работать вместе? C++
C++ Как ввести двумерный массив с клавиатуры? Его размерность [n][m] нужно задавать с клавиатуры.
C++ Как заставить CEdit реагировать на ' ' ?
Как заставить работать <algorithm> C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
NNN777
299 / 157 / 19
Регистрация: 27.02.2010
Сообщений: 317
12.05.2011, 13:01     Заставить индикаторы клавиатуры мигать #2
По моим наблюдения, эти функции с параметрами FALSE отключают индикаторы, если они были активированы вручную (нажатием с клавиатуры соответствующих клавиш, до запуска программы), если же они были активированы программно (теми же функциями с параметром TRUE), то и отключить их можно теми же функциями с параметром TRUE...
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
int main()
   {
      SetNumLock( TRUE );
      SetCapsLock(TRUE);
      SetScrLock (TRUE);
      int a;
      std::cin>>a;
 
      SetNumLock( TRUE );
      SetCapsLock(TRUE);
      SetScrLock (TRUE);
 
      SetNumLock( FALSE );
      SetCapsLock(FALSE);
      SetScrLock (FALSE);
      return 0;
   }
Gepar
 Аватар для Gepar
1173 / 529 / 20
Регистрация: 01.07.2009
Сообщений: 3,512
12.05.2011, 18:03  [ТС]     Заставить индикаторы клавиатуры мигать #3
NNN777, нет, там кое-что другое. Программа ведь эмулирует не только действие но и нажатие клавиши. В общем-то при указании куда в память пихать нажатие (0x45 у NumLock) нужно разбираться. Я же особо не понял от чего этот адрес зависит. Да, там есть коды всех клавиш (Virtual Key Codes) и вроде всё логично, но нет же - 0x45 там то не у намлока, а у одной из букв, а у намлока свой код что меня и сбило с толку.
Хотя это не помешало методом тыка сделать цикл чтобы лампочки хаотично моргали - они выключаются и включаются раз в несколько циклов, а не в один. Почему так - я догадываюсь что в этом регистре состояний куда мы пихаем команды по нажатию клавиш при добавлении нового значения идёт сдвиг старого и код выключения клавиши в итоге "доходит" не сразу (а когда его "подпихнут" новые значения. В общем написал размыто, но думаю понять можно.
Код показывал вот такой:
Код
 #include <windows.h>
 #include <iostream>

   void SetNumLock( BOOL bState )
   {
      BYTE keyState[256];

      GetKeyboardState((LPBYTE)&keyState);
      if( (bState && !(keyState[VK_NUMLOCK] & 1)) ||
          (!bState && (keyState[VK_NUMLOCK] & 1)) )
      {

         keybd_event( VK_NUMLOCK,
                      0x45,
                      KEYEVENTF_EXTENDEDKEY | 0,
                      0 );


         keybd_event( VK_NUMLOCK,
                      0x45,
                      KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP,
                      0);
      }
   }
   void SetCapsLock( BOOL bState )
   {
      BYTE keyState[256];

      GetKeyboardState((LPBYTE)&keyState);
      if( (bState && !(keyState[VK_CAPITAL] & 1)) ||
          (!bState && (keyState[VK_CAPITAL] & 1)) )
      {

         keybd_event( VK_CAPITAL,
                      0x45,
                      KEYEVENTF_EXTENDEDKEY | 0,
                      0 );


         keybd_event( VK_CAPITAL,
                      0x14,
                      KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP,
                      0);
      }
   }

   void SetScrLock( BOOL bState )
   {
      BYTE keyState[256];

      GetKeyboardState((LPBYTE)&keyState);
      if( (bState && !(keyState[VK_SCROLL] & 1)) ||
          (!bState && (keyState[VK_SCROLL] & 1)) )
      {

         keybd_event( VK_SCROLL,
                      0x91,
                      KEYEVENTF_EXTENDEDKEY | 0,
                      0 );


         keybd_event( VK_SCROLL,
                      0x91,
                      KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP,
                      0);
      }
   }


int main()
{
int count=1000;
do
{
    SetNumLock( TRUE );
    SetCapsLock(TRUE);
    SetScrLock (TRUE);
    SetNumLock( FALSE );
    SetCapsLock(FALSE);
    SetScrLock (FALSE);
    if (count%50==0)
    std::cout<<'\a';
    count--;
}while(count);
return 0;
}
Не сложно догадаться что ни о какой 1000 миганий индикаторов за весь цикл и речи быть не может.
Кстати если зациклить и поставить 1 beep за 1 проход и запустить на более-менее нагруженном пк то ... а смотрите сами, хотя это и так логично
NNN777
299 / 157 / 19
Регистрация: 27.02.2010
Сообщений: 317
13.05.2011, 16:10     Заставить индикаторы клавиатуры мигать #4
0х45 - это, как мне кажется, не адрес в памяти, а скен-код (у каждой клавиши на клавиатуре есть скен-код и аски, но это, я думаю, вы и без меня знаете)). В этой функции он необязателен, поэтому на его место можно написать любой код, как вы и сделали в 2-х остальных функциях.
Там действительно есть буфер) После нажатия клавиши, ее скен-код попадает на соответствующий порт, после чего за дело берется драйвер клавиатуры. Он помещает в этот консольный буфер код клавиши (скен-код и аски (у Num, caps и Scroll аски кода нет), если я ничего не путаю. Но этот буфер расчитан на 15 слов, поэтому 1000 нажатий без соответствующих предупредительных сигналов - это странно, значат коды все-таки забирались... И еще все-таки интересно, почему функция SetNumLock с параметром false отключает индикатор, если клавиша была нажата вручную, а не программно, а нажатую программно клавишу отключает эта функция с параметром true... Если разберетесь, отпишитесь - стало интересно)
а задержку можете сделать так
C++
1
Sleep(10000);
Yandex
Объявления
13.05.2011, 16:10     Заставить индикаторы клавиатуры мигать
Ответ Создать тему
Опции темы

Текущее время: 05:35. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru