Пример #1
0
void wmSetSelection(MPARAM mp1)
{  // I also need to change the state, not only the leds.
    BYTE keyState[256];
    if (mp1) {  // Window is selected
        WinSetKeyboardStateTable(HWND_DESKTOP, keyState, FALSE);
        //        vk_desktop.numlock    = keyState[VK_NUMLOCK];
        vk_desktop.scrllock   = keyState[VK_SCRLLOCK];
        vk_desktop.capslock   = keyState[VK_CAPSLOCK];
        //        keyState[VK_NUMLOCK]  = vk_vice.numlock;
        keyState[VK_SCRLLOCK] = vk_vice.scrllock;
        keyState[VK_CAPSLOCK] &= ~1; //vk_vice.capslock;
        WinSetKeyboardStateTable(HWND_DESKTOP, keyState, TRUE);
        PM_winActive=1;
    }
    else {     // Window is deselected
        PM_winActive=0;
        WinSetKeyboardStateTable(HWND_DESKTOP, keyState, FALSE);
        //        vk_vice.numlock       = keyState[VK_NUMLOCK];
        vk_vice.scrllock      = keyState[VK_SCRLLOCK];
        //        vk_vice.capslock      = keyState[VK_CAPSLOCK];
        //        keyState[VK_NUMLOCK]  = vk_desktop.numlock;
        keyState[VK_SCRLLOCK] = vk_desktop.scrllock;
        keyState[VK_CAPSLOCK] = vk_desktop.capslock;
        WinSetKeyboardStateTable(HWND_DESKTOP, keyState, TRUE);
    }

}
Пример #2
0
void wmDestroy(void)
{  // it seems, that restoring key-state doesn't work here.
    BYTE keyState[256];
    PM_winActive=0;
    WinSetKeyboardStateTable(HWND_DESKTOP, keyState, FALSE);
    //    keyState[VK_NUMLOCK]  = vk_desktop.numlock;
    keyState[VK_SCRLLOCK] = vk_desktop.scrllock;
    keyState[VK_CAPSLOCK] = vk_desktop.capslock;
    WinSetKeyboardStateTable(HWND_DESKTOP, keyState, TRUE);
}
Пример #3
0
void wmCreate(void)
{
    BYTE keyState[256];
    WinSetKeyboardStateTable(HWND_DESKTOP, keyState, FALSE);
    //    vk_desktop.numlock    = keyState[VK_NUMLOCK];
    vk_desktop.scrllock   = keyState[VK_SCRLLOCK];
    vk_desktop.capslock   = keyState[VK_CAPSLOCK];
    //    keyState[VK_NUMLOCK]  &= ~1;
    keyState[VK_SCRLLOCK] &= ~1;
    keyState[VK_CAPSLOCK] &= ~1;
    WinSetKeyboardStateTable(HWND_DESKTOP, keyState, TRUE);
    PM_winActive=TRUE;
}
Пример #4
0
BOOL isCapsLockOn( VOID )
{
    BYTE keyState[ 256 ];

    WinSetKeyboardStateTable( HWND_DESKTOP, keyState, FALSE );

    return ( keyState[ VK_CAPSLOCK ] & 0x01 );
}
static VOID _writestate(VOID)
/* 
 * This function sets the keyboard state as described by the KeyState
 * and ss global structures.
 *
 * We use the hf global variable as well as the KeyState and ss global
 * structures.
 *
 * Returns:  nothing.
 */
{
  ULONG ulAction, ulLength;
  unsigned short w;
 
  WinSetKeyboardStateTable(HWND_DESKTOP, &KeyState[1], TRUE);

  ulAction = sizeof(ss);
  ulLength = 0;
  rc = DosDevIOCtl(hf,
                   IOCTL_KEYBOARD,
                   KBD_SETSHIFTSTATE,
                   &ss,
                   sizeof(ss),
                   &ulAction,
                   0,
                   0,
                   &ulLength);

  w  = (ss.fsState & (CAPSLOCK_ON|NUMLOCK_ON|SCROLLLOCK_ON)) >> 4;
 
  ulAction = sizeof(w);
  rc = DosDevIOCtl(hf,
                   IOCTL_KEYBOARD,
                   0x5A, /* KBD_ALTERKEYBOARDLED */
                   &w,
                   sizeof(w),
                   &ulAction,
                   0,
                   0,
                   &ulLength);

  rc = DosClose(hf);
}
static VOID _readstate(VOID)
/* 
 * This function reads the current keyboard state, and stores the results
 * in the KeyState and ss global structures.
 *
 * We use the hf global variable, as well as the KeyState and ss global
 * structures.
 *
 * Returns:  nothing.
 */
{
  ULONG ulAction, ulLength;
 
  rc = DosOpen("KBD$",
               &hf,
               &ulAction,
               0L,
               0,
               FILE_OPEN,
               OPEN_ACCESS_READONLY|OPEN_SHARE_DENYNONE,
               0);
 
  ulAction = 0;
  ulLength = sizeof(ss);
  rc = DosDevIOCtl(hf,
                   IOCTL_KEYBOARD,
                   KBD_GETSHIFTSTATE,
                   0,
                   0,
                   &ulAction,
                   &ss,
                   sizeof(ss),
                   &ulLength);

  WinSetKeyboardStateTable(HWND_DESKTOP, &KeyState[1], FALSE);
}
// Message - сообщение, Scan_code - клавиша, Modifiers - клавиши Ctrl, Alt и Shift.
// Post_marker_message означает, что в очередь окна надо направить сообщение WM_MARK.
// Если переменная Message не задана - надо сбросить клавиши в исходное состояние.
VOID KbdState_ChangePMKeyboardState( PQMSG Message, SHORT Scan_code, SHORT Modifiers, BYTE Post_marker_message = 1 )
{
 // Узнаем состояние клавиатуры.
 HWND Desktop = QueryDesktopWindow();

 BYTE Keyboard_state[ 256 ]; bzero( Keyboard_state, sizeof( BYTE ) * 256 );
 WinSetKeyboardStateTable( Desktop, Keyboard_state, 0 );

 // Включаем или выключаем Ctrl, Alt и Shift.
 if( Message != NULL )
  {
   if( Scan_code == SC_INSERT ) Keyboard_state[ VK_INSERT ] = SET_KEY_PRESSED; else Keyboard_state[ VK_INSERT ] = 0;
   if( Scan_code == SC_DELETE ) Keyboard_state[ VK_DELETE ] = SET_KEY_PRESSED; else Keyboard_state[ VK_DELETE ] = 0;
   if( Scan_code == SC_BACKSPACE ) Keyboard_state[ VK_BACKSPACE ] = SET_KEY_PRESSED; else Keyboard_state[ VK_BACKSPACE ] = 0;

   if( Modifiers & KC_CTRL ) Keyboard_state[ VK_CTRL ] = SET_KEY_PRESSED; else Keyboard_state[ VK_CTRL ] = 0;
   if( Modifiers & KC_ALT ) Keyboard_state[ KC_ALT ] = SET_KEY_PRESSED; else Keyboard_state[ KC_ALT ] = 0;
   if( Modifiers & KC_SHIFT ) Keyboard_state[ VK_SHIFT ] = SET_KEY_PRESSED; else Keyboard_state[ VK_SHIFT ] = 0;
  }
 // Или восстанавливаем настоящие значения.
 else
  {
   if( KeyIsPressed( SC_INSERT ) ) Keyboard_state[ VK_INSERT ] = SET_KEY_PRESSED; else Keyboard_state[ VK_INSERT ] = 0;
   if( KeyIsPressed( SC_DELETE ) ) Keyboard_state[ VK_DELETE ] = SET_KEY_PRESSED; else Keyboard_state[ VK_DELETE ] = 0;
   if( KeyIsPressed( SC_BACKSPACE ) ) Keyboard_state[ VK_BACKSPACE ] = SET_KEY_PRESSED; else Keyboard_state[ VK_BACKSPACE ] = 0;

   if( CtrlIsPressed() ) Keyboard_state[ VK_CTRL ] = SET_KEY_PRESSED; else Keyboard_state[ VK_CTRL ] = 0;
   if( AltIsPressed() ) Keyboard_state[ KC_ALT ] = SET_KEY_PRESSED; else Keyboard_state[ KC_ALT ] = 0;
   if( ShiftIsPressed() ) Keyboard_state[ VK_SHIFT ] = SET_KEY_PRESSED; else Keyboard_state[ VK_SHIFT ] = 0;
  }

 // Сбрасываем все сведения о кнопках мыши. Это необходимо при вставке текста с помощью
 // средней кнопки, когда сообщения сбрасываются, и данные, что кнопка нажата, остаются.
 Keyboard_state[ VK_BUTTON1 ] = 0;
 Keyboard_state[ VK_BUTTON2 ] = 0;
 Keyboard_state[ VK_BUTTON3 ] = 0;

 // Устанавливаем новое состояние клавиатуры.
 WinSetKeyboardStateTable( Desktop, Keyboard_state, 1 );

 // Запоминаем, что состояние клавиатуры изменено.
 if( Message != NULL )
  {
   // Запоминаем, что состояние клавиатуры изменено.
   KbdState.Keyboard_state_is_changed = 1;

   // Если в очередь окна надо направить сообщение:
   if( Post_marker_message )
    {
     // Посылаем в очередь окна сообщение WM_MARK. Когда оно будет получено, состояние можно будет вернуть назад.
     HMQ Message_queue = WinQueryWindowULong( Message->hwnd, QWL_HMQ );
     WinPostQueueMsg( Message_queue, WM_MARK, (MPARAM) MRK_KBD_MODIFIERS, 0 );
    }
  }
 // Или запоминаем, что состояние клавиатуры восстановлено.
 else
  {
   // Запоминаем, что состояние клавиатуры восстановлено.
   KbdState.Keyboard_state_is_changed = 0;
  }

 // Возврат.
 return;
}