| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 617 人关注过本帖
标题:关于windows平台读键盘按键的问题
只看楼主 加入收藏
Bccn1993
Rank: 1
等 级:新手上路
威 望:1
帖 子:4
专家分:0
注 册:2023-4-21
结帖率:0
收藏
已结贴  问题点数:20 回复次数:3 
关于windows平台读键盘按键的问题
背景是读键盘按键的程序,功能为按下一个键记录起始时间,放开一个键打印结束时间,从而记录按下的时间。
但是发现现有方案都有一个问题,就是,当我按下一个键不放,此时再按下一个键时,无法读到后面按下的键。
我尝试过其实于_kbhit()+getchar()的方法和ReadConsoleInput()方法都无法处理这个问题,请问是否有可以参考的方法和思路?

新人只有20分,全送了。
搜索更多相关主题的帖子: 平台 windows 方法 按键 键盘 
2023-04-21 10:19
forever74
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:CC
等 级:版主
威 望:58
帖 子:1705
专家分:4345
注 册:2007-12-27
收藏
得分:7 
学习一下windows程序结构。消息传递机制和处理消息的回调函数。然后考虑一下不写TranslateMessage的后果。

对宇宙最严谨的描述应该就是宇宙其实是不严谨的
2023-04-21 11:09
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9031
专家分:54061
注 册:2011-1-18
收藏
得分:7 
但是发现现有方案都有一个问题,就是,当我按下一个键不放,此时再按下一个键时,无法读到后面按下的键。

https://bbs.bccn.net/viewthread.php?tid=511685&page=1#pid2775217
2023-04-21 15:14
东海ECS
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:Python
等 级:版主
威 望:32
帖 子:412
专家分:1646
注 册:2023-1-24
收藏
得分:7 
你可以使用Windows API函数来实现读取键盘输入的功能,并记录按下时间和放开时间。可以参考以下代码的思路:

1.使用GetAsyncKeyState函数判断某个键是否被按下。

2.如果某个键被按下,记录当前时间为该键的按下时间,并等待该键被释放。

3.当该键被释放时,记录当前时间为该键的放开时间,计算按下和放开时间的差值即为按键持续时间。

4.可以使用一个缓存区来记录多个键的按下和放开时间,如果缓存区已满,则将最早的键的记录覆盖掉。

下面是一个示例代码,可以实现记录多个键的按下时间和放开时间,并计算持续时间:

程序代码:
#include <iostream>
#include <Windows.h>

#define MAX_BUFFER_SIZE 10

struct KeyRecord {
    bool keyDown = false;
    bool keyUp = false;
    DWORD downTime = 0;
    DWORD upTime = 0;
};

void printRecord(const KeyRecord& record) {
    std::cout << "KeyDown: " << record.downTime << ", KeyUp: " << record.upTime
              << ", Duration: " << (record.upTime - record.downTime) << std::endl;
}

int main() {
    KeyRecord buffer[MAX_BUFFER_SIZE];
    int bufferIndex = 0;

    while (true) {
        for (int i = 0; i < 256; ++i) {
            if (GetAsyncKeyState(i) & 0x8000) {
                // Key is down
                if (!buffer[bufferIndex].keyDown) {
                    buffer[bufferIndex].keyDown = true;
                    buffer[bufferIndex].downTime = GetTickCount();
                    std::cout << "Press " << i << "..." << std::endl;
                }
            } else {
                // Key is up
                if (buffer[bufferIndex].keyDown && !buffer[bufferIndex].keyUp) {
                    buffer[bufferIndex].keyUp = true;
                    buffer[bufferIndex].upTime = GetTickCount();
                    printRecord(buffer[bufferIndex]);
                    bufferIndex = (bufferIndex + 1) % MAX_BUFFER_SIZE;
                }
            }
        }
    }

    return 0;
}

通过调用GetAsyncKeyState函数来获取每个键的状态,如果某个键被按下则记录起始时间,等待放开并记录结束时间,最后计算持续时间并输出。结果类似于:

Press 65...
KeyUp: 119392, KeyUp: 119425, Duration: 33





会当凌绝顶,一览众山小.
2023-04-21 19:00
快速回复:关于windows平台读键盘按键的问题
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.028745 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved