我现在想做一个程序,就是一直按住CTRL键,程序结束时ctrl再弹起,否则就一直处于按住状态。 

解决方案 »

  1.   


    void SendKeyDown(BYTE VKey, WORD NumTimes, bool GenUpMsg, bool bDelay)
    {
      WORD Cnt = 0;
      BYTE ScanCode = 0;
      bool NumState = false;  if (VKey == VK_NUMLOCK)
      {
        DWORD dwVersion = ::GetVersion();    for (Cnt=1; Cnt<=NumTimes; Cnt++)
        {
          if (bDelay)
            CarryDelay();
          // snippet based on:
          // http://www.codeproject.com/cpp/togglekeys.asp
          if (dwVersion < 0x80000000)
          {
            ::keybd_event(VKey, 0x45, KEYEVENTF_EXTENDEDKEY, 0);
            ::keybd_event(VKey, 0x45, KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP, 0);
          }
          else
          {
            // Win98 and later
            if ( ((DWORD)(HIBYTE(LOWORD(dwVersion))) >= 10) )
            {
              // Define _WIN32_WINNT > 0x0400
              // to compile
              INPUT input[2] = {0};
              input[0].type = input[1].type = INPUT_KEYBOARD;
              input[0].ki.wVk = input[1].ki.wVk = VKey;
              input[1].ki.dwFlags = KEYEVENTF_KEYUP;
              ::SendInput(sizeof(input) / sizeof(INPUT), input, sizeof(INPUT));
            }
            // Win95
            else
            {
              KEYBOARDSTATE_t KeyboardState;
              NumState = GetKeyState(VK_NUMLOCK) & 1 ? true : false;
              GetKeyboardState(&KeyboardState[0]);
              if (NumState)
                KeyboardState[VK_NUMLOCK] &= ~1;
              else
                KeyboardState[VK_NUMLOCK] |= 1;          SetKeyboardState(&KeyboardState[0]);
            }
          }
        }
        return;
      }  // Get scancode
      ScanCode = LOBYTE(::MapVirtualKey(VKey, 0));  // Send keys
      for (Cnt=1; Cnt<=NumTimes; Cnt++)
      {
        // Carry needed delay ?
        if (bDelay)
          CarryDelay();    KeyboardEvent(VKey, ScanCode, IsVkExtended(VKey) ? KEYEVENTF_EXTENDEDKEY : 0);
        if (GenUpMsg)
          KeyboardEvent(VKey, ScanCode, KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP);
      }
    }//调用
    SendKeyDown(VK_CONTROL, 1, false);
      

  2.   

    按住键盘的时候应该一直不停的发送按键消息,但是
    例如一直按住shift建1秒钟会产生如下消息
    消息              虚拟键代码    先前状态
    WM_KEYDOWN    VK_SHIFT      0
    WM_KEYDOWN    VK_SHIFT      1
    WM_KEYDOWN    VK_SHIFT      1
    WM_KEYDOWN    VK_SHIFT      1
    WM_KEYDOWN    VK_SHIFT      1
    WM_KEYDOWN    VK_SHIFT      1
    。。
    WM_KEYUP      VK_SHIFT      1