C++ 捕捉按键C++;

C++ 捕捉按键C++;,c++,for-loop,while-loop,keypress,C++,For Loop,While Loop,Keypress,我使用一个简单的循环捕捉用户按键 while (1) { for(i = 8; i <= 190; i++) { if (GetAsyncKeyState(i) == -32767){ //Do stuff } } } while(1) { 对于(i=8;i您可以使用 while (!kbhit()); 这可能会有所帮助。请查看下面的链接,该链接解释了如何使用示例代码正确使用GetAsyncKeyState()。

我使用一个简单的循环捕捉用户按键

while (1)
{
    for(i = 8; i <= 190; i++)
    {
       if (GetAsyncKeyState(i) == -32767){
         //Do stuff
       }
    }
}
while(1)
{
对于(i=8;i您可以使用

while (!kbhit());

这可能会有所帮助。

请查看下面的链接,该链接解释了如何使用示例代码正确使用GetAsyncKeyState()。

希望此链接可以帮助您解决问题

编辑: GetAsyncKeyState()函数不适合您尝试执行的操作

它所做的只是简单地检查键盘上某个键在这个纳秒位置的实际电流。这样做几乎总是不正确的

相反,请使用正确的输入函数读取控制台输入。请在下面找到示例代码

#include <stdio.h>
#include <windows.h>

int main()
{
    DWORD        mode;          /* Preserved console mode */
    INPUT_RECORD event;         /* Input event */
    BOOL         done = FALSE;  /* Program termination flag */
    unsigned int counter = 0;   /* The number of times 'Esc' is pressed */

    /* Don't use binary for text files, OK?  ;-) */
    FILE* myfile = fopen( "example.txt", "w" );

    /* Get the console input handle */
    HANDLE hstdin = GetStdHandle( STD_INPUT_HANDLE );

    /* Preserve the original console mode */
    GetConsoleMode( hstdin, &mode );

    /* Set to no line-buffering, no echo, no special-key-processing */
    SetConsoleMode( hstdin, 0 );

    /* Give the user instructions */
    printf(
        "Press Escape as many times as you like.\n"
        "Press anything else to quit.\n\n"
        );

    while (!done)
    {
        if (WaitForSingleObject( hstdin, 0 ) == WAIT_OBJECT_0)  /* if kbhit */
        {
            DWORD count;  /* ignored */

            /* Get the input event */
            ReadConsoleInput( hstdin, &event, 1, &count );

            /* Only respond to key release events */
            if ((event.EventType == KEY_EVENT)
            &&  !event.Event.KeyEvent.bKeyDown)
                switch (event.Event.KeyEvent.wVirtualKeyCode)
                {
                    case VK_ESCAPE:
                        counter++;
                        fprintf( myfile, "Escape: %d\n", counter );
                        printf( "Button pressed!\n" );
                        break;
                    default:
                        done = TRUE;
                }
        }
    }

    /* All done! */
    printf( "You pressed the Escape key %d times\n", counter );
    fclose( myfile );
    SetConsoleMode( hstdin, mode );
    return 0;
}
#包括
#包括
int main()
{
DWORD模式;/*保留控制台模式*/
输入\记录事件;/*输入事件*/
BOOL done=FALSE;/*程序终止标志*/
unsigned int counter=0;/*按下“Esc”的次数*/
/*不要将二进制文件用于文本文件,好吗?;-)*/
FILE*myfile=fopen(“example.txt”、“w”);
/*获取控制台输入句柄*/
句柄hstdin=GetStdHandle(标准输入句柄);
/*保留原始控制台模式*/
GetConsoleMode(hstdin和模式);
/*设置为无线路缓冲、无回音、无特殊按键处理*/
设置控制台模式(hstdin,0);
/*给出用户说明*/
printf(
“按Escape任意次数。\n”
“按任何其他按钮退出。\n\n”
);
而(!完成)
{
if(WaitForSingleObject(hstdin,0)=WAIT_OBJECT_0)/*if kbhit*/
{
DWORD计数;/*已忽略*/
/*获取输入事件*/
读控制台输入(hstdin和事件、1和计数);
/*仅响应密钥释放事件*/
if((event.EventType==KEY\u事件)
&&!event.event.KeyEvent.bKeyDown)
开关(event.event.KeyEvent.wVirtualKeyCode)
{
案件VK_逃逸:
计数器++;
fprintf(myfile,“转义:%d\n”,计数器);
printf(“按下按钮!\n”);
打破
违约:
完成=正确;
}
}
}
/*全部完成*/
printf(“您按了转义键%d次,\n”,计数器);
fclose(myfile);
设置控制台模式(hstdin,模式);
返回0;
}

将无限循环放在一个工作线程中,并在每次迭代中让它休眠一段合理的时间间隔。C++11使这非常容易:

#include <thread>
#include <chrono>

std::chrono::milliseconds THREAD_WAIT = 50;

int keypress = -1;

void GetKeyPress()
{
   while (1)
   {
       for(i = 8; i <= 190; i++)
       {
          int k = GetAsyncKeyState(i);
          if (/*whatever condition needs to be satisfied*/)
              keypress = k;
       }
       if (keypress != -1) break; //Use this only if you have td.join() below
       std::this_thread::sleep_for(THREAD_WAIT);
   }
}

int main(void)
{
   ...

   std::thread td( GetKeyPress );
   td.join(); //If you want to block until the user presses a key, otherwise remove.

   //If no join(), do the rest of your program, checking in on keypress when need be

   return 0;
}
#包括
#包括
std::chrono::毫秒线程等待=50;
int按键=-1;
void GetKeyPress()
{
而(1)
{

对于(i=8;i您不能使用线性算法进行此操作…您需要向您的程序添加一个侦听器。谷歌搜索。使用钩子。
GetMessage
将在关键事件发生之前处于空闲状态。对于更脏的解决方案,请添加
Sleep(10)
或循环中的某个东西。过去我使用了
注册表快捷键
取消注册快捷键
的组合。但是,我只想在窗口对焦时检测按键。因此,当窗口对焦时,我调用
取消注册快捷键
,当窗口重新对焦时,我将其注册回来。梅这些函数将对您有所帮助。如果您在窗口未聚焦时不注销热键,可能会弄乱其他应用程序热键。我的编译器无法识别kbhit(DevC++)该命令将在哪个编译器中工作?现在可以工作了。谢谢,尽管CPU仍然非常高,但我将尝试其他注释建议的挂钩或侦听器。谢谢。