gpt4 book ai didi

c - 如何访问 PC 键盘缓冲区以检测多个按键按下和按键释放?

转载 作者:太空宇宙 更新时间:2023-11-04 08:12:57 24 4
gpt4 key购买 nike

我正在用 C 语言为 PC 制作一个口琴合成器软件,为此我必须检测多个按键和按键释放,以便相应地同时播放音符。所以,我认为访问键盘缓冲区会有所帮助。但我不知道该怎么做。因此,任何人都可以建议这样做的方法或一些检测多个按键的新想法。为了检测单个按键和按键释放,我使用 kbhit() 和 getch() 函数编写了以下 C 代码:-

#include<stdio.h>
#include<stdlib.h>
#include<conio.h>
#include<time.h>

void keypress(char);
void delay(int);

int flag=0;

int main()
{
char c;

while(1)
{
if(kbhit())
{
c=getch();

printf("\nCharacter:%c",c);

getch();

keypress(c);

printf("\nKey Released");

}
}

return 0;
}

void keypress(char ch)
{
char c;

delay(50);

if(kbhit())
{
c=getch();

if(c==ch)
{
keypress(c);
}

}
}

void delay(int milliSeconds)
{
clock_t final_time = milliSeconds + clock();
while (final_time > clock());
}

但是它有一些问题,比如:-

1).未检测到多次按键

2).它产生的延迟非常小

那么任何人都可以建议改进代码以解决上述问题或一些检测多个按键和按键释放的新技术。

平台:-Windows 8.1

如果解决方案对平台友好就好了。

谢谢!

最佳答案

这显示了如何使用 Windows GetAsyncKeyState 函数。它不需要在 GUI 中 - 此控制台应用程序如图所示工作。由您检查位状态标志 as documented来决定行动。例如,按下某个键时自动重复。您可能也不需要检查每个 key 。

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

int main(void)
{
unsigned short buff[256] = {0};
unsigned short kval;
int i;
while (1) {
for(i=0; i<256; i++) {
kval = GetAsyncKeyState(i);
if(kval != buff[i]) {
printf("%02X:%04X ", i, kval);
buff[i] = kval;
}
}
}
return 0;
}

在这个测试中,第一行是在我按下任何键之前输出的。当我按下并释放 'A' 时输出第二行。

0D:0001 26:0001 45:0001 53:0001 54:0001 0D:0000 26:0000 45:0000 53:0000 54:0000
41:8001 41:8000 41:0000

注意:链接到user32.lib

关于c - 如何访问 PC 键盘缓冲区以检测多个按键按下和按键释放?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37832235/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com