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

Состояния клавиш - C++

Восстановить пароль Регистрация
 
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
13.06.2012, 10:04     Состояния клавиш #1
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
 Statuses.Forward  =((GetAsyncKeyState(Keys.Forward  )&0x8000)==0x8000);
 Statuses.Back     =((GetAsyncKeyState(Keys.Back     )&0x8000)==0x8000);
 Statuses.RightTurn=((GetAsyncKeyState(Keys.RightTurn)&0x8000)==0x8000);
 Statuses.LeftTurn =((GetAsyncKeyState(Keys.LeftTurn )&0x8000)==0x8000);
 Statuses.RightStep=((GetAsyncKeyState(Keys.RightStep)&0x8000)==0x8000);
 Statuses.LeftStep =((GetAsyncKeyState(Keys.LeftStep )&0x8000)==0x8000);
 Statuses.Quick    =((GetAsyncKeyState(Keys.Quick    )&0x8000)==0x8000);
 Statuses.Slow     =((GetAsyncKeyState(Keys.Slow     )&0x8000)==0x8000);
 if ((!Statuses.Quick)&&(!Statuses.Slow))
 {
  Speed=1.0;
 }
 if ((Statuses.Quick)&&(!Statuses.Slow))
 {
  Speed=2.0;
 }
 if ((!Statuses.Quick)&&(Statuses.Slow))
 {
  Speed=0.5;
 }
 if ((Statuses.Quick)&&(Statuses.Slow))
 {
  Speed=1.5;
 }
 if ((GetAsyncKeyState(Keys.Exit)&0x8000)==0x8000)
 {
  Statuses.ExitQuery=true;
 }
 if (Statuses.ExitQuery)
 {
  if ((GetAsyncKeyState(Keys.Yes)&0x8000)==0x8000)
  {
   Statuses.Exit=true;
  }
  if ((GetAsyncKeyState(Keys.No)&0x8000)==0x8000)
  {
   Statuses.ExitQuery=false;
  }
 }
В принципе, работает, отличает левый shift от правого, но при выключенном NumLock принимает цифры цифрового блока за кнопки управления кареткой. А мне надо во-первых различать при любом состоянии NumLock, а во-вторых цифры должны распознаваться одинаково не зависимо от состояния NumLock. Как это исправить? Левые shift, ctrl и alt надо отличать от правых. Цифры и точка в цифровом блоке должны опознаваться как таковые, не зависимо от состояния NumLock и ни когда не приниматься за кнопки управления кареткой и inset, home, page up, delete, end, page down. Как это сделать? И где брать коды клавиш? В тех, что есть я не нашёл даже кнопку с точкой и знаком > (на которой русская "Ю").
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
kazak
 Аватар для kazak
3029 / 2350 / 155
Регистрация: 11.03.2009
Сообщений: 5,401
13.06.2012, 12:38     Состояния клавиш #2
Цитата Сообщение от taras atavin Посмотреть сообщение
Левые shift, ctrl и alt надо отличать от правых.
Можно различать по виртуальным кодам
VK_RSHIFT/VK_LSHIFT, VK_RCONTROL/VK_LCONTROL, VK_RMENU/VK_LMENU

Цитата Сообщение от taras atavin Посмотреть сообщение
но при выключенном NumLock принимает цифры цифрового блока за кнопки управления кареткой.
Так в общем задумано.


Цитата Сообщение от taras atavin Посмотреть сообщение
мне надо во-первых различать при любом состоянии NumLock, а во-вторых цифры должны распознаваться одинаково не зависимо от состояния NumLock.
На ум приходит только отслеживание нажатия NumLock, и включение его обратно программно.
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
13.06.2012, 13:18  [ТС]     Состояния клавиш #3
Цитата Сообщение от kazak Посмотреть сообщение
Так в общем задумано.
при наборе. Но в игре мне бы не зотелось зависеть от намлока. Или это не возможно?

Добавлено через 55 секунд
Цитата Сообщение от kazak Посмотреть сообщение
На ум приходит только отслеживание нажатия NumLock, и включение его обратно программно.
Отследить не проблема. 0x90. А Как включить?
kazak
 Аватар для kazak
3029 / 2350 / 155
Регистрация: 11.03.2009
Сообщений: 5,401
13.06.2012, 13:52     Состояния клавиш #4
Цитата Сообщение от taras atavin Посмотреть сообщение
А Как включить?
http://msdn.microsoft.com/en-us/libr...(v=vs.85).aspx
как раз с нужным примером.
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
13.06.2012, 16:52  [ТС]     Состояния клавиш #5
Синтезирует нажатия клавиши. Система может использовать такие синтезированные клавиши для создания WM_KEYUP или WM_KEYDOWN сообщения. Обработчик прерываний клавиатуры водителя называет keybd_event функции.
И что? А как реально включить NumLock?
kazak
 Аватар для kazak
3029 / 2350 / 155
Регистрация: 11.03.2009
Сообщений: 5,401
15.06.2012, 18:40     Состояния клавиш #6
Пример смотрел на той странице?
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
#include <windows.h>
 
   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 main()
   {
      SetNumLock( TRUE );
   }
Yandex
Объявления
15.06.2012, 18:40     Состояния клавиш
Ответ Создать тему
Опции темы

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