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仍然非常高,但我将尝试其他注释建议的挂钩或侦听器。谢谢。