利用QT做一个键盘检测的例子
键盘的扫描码、虚拟码:
当用户按下某个键时,
1.键盘会检测到这个动作,并通过键盘控制器把扫描码(scan code)传送到计算机;
键盘扫描码跟具体的硬件有关的,不同厂商对同一个键的扫描码有可能不同。
2.计算机接收到扫描码后,将其交给键盘驱动程序;
3.键盘驱动程序把这个扫描码转换为键盘虚拟码;
虚拟码与具体硬件无关,不同厂商的键盘,同一个键的虚拟码总是相同的。
3.然后,键盘驱动程序把该键盘操作的扫描码和虚拟码以及其它信息传递给操作系统;
4.操作系统将获得的信息封装在一个键盘消息中,并把该键盘消息插入到消息列队。
5.通过Windows的消息系统,该键盘消息被送到某个窗口中;
6.窗口所在的应用程序接收到消息后,可以了解到有关键盘操作的信息,然后决定作出一定的响应
键盘消息:WM_KEYDOWN
nVirtKey = (int) wParam; // 虚拟码
lKeyData = lParam; // 键盘操作的相关信息
键盘消息WM_KEYDOWN的第二个参数lParam比较复杂
其作用是指定重复次数、扫描码、扩展键标记、上下文环境码、前键状态标记、转换状态标记等
lParam: 总长4字节,32位
0–15位:用于指定当前消息的重复次数。当用户按下某个键持续一段时间的话,
该值是自动计数的按下某键的次数;若按键时间很长,则会发出多个消息,
且重复次数不会累计
16–23:指定扫描码
24:指定是否该键是一个扩展键(如alt、ctrl),若值为1表示是扩展键,否则其值为0
25–28:保留
29:指定上下文环境码。对于WM_KEYDOWN、WM_KEYUP消息,其值总为0,
对WM_CHAR消息,如果同时alt键被按下,则值为1,否则值为0.
30:指定前键状态。如果消息发送前该键是按下状态,其值为1,否则为0
31:指定转换状态,对于WM_KEYDOWN,其值总为0;
对于WM_CHAR,如果该键被释放,则其值为1,否则为0.
下面就是代码
1.添加头文件
#include <QDialog>
#include <QKeyEvent>
#include <QDebug>
2.添加函数变量声明
private:
void keyPressEvent(QKeyEvent* );
void keyReleaseEvent(QKeyEvent *);
//打印按键信息
void printKeyEvent(const QString& strAction,
QKeyEvent*)const;
3.添加.cpp代码
KeyboradDialog::KeyboradDialog(QWidget *parent) :
QDialog(parent),
ui(new Ui::KeyboradDialog)
{
ui->setupUi(this);
}
KeyboradDialog::~KeyboradDialog()
{
delete ui;
}
void KeyboradDialog::keyPressEvent(QKeyEvent *event){
printKeyEvent("按下",event);
}
void KeyboradDialog::keyReleaseEvent(QKeyEvent *event){
printKeyEvent("抬起",event);
}
void KeyboradDialog::printKeyEvent(
const QString &strAction,
QKeyEvent *event) const{
qDebug() << strAction;
qDebug() << event->text();
qDebug("按键代码:%d",event->key());
qDebug("扫描键码:%d",event->nativeScanCode());
qDebug("虚拟键码:%d",event->nativeVirtualKey());
qDebug("测试组合按键:");
Qt::KeyboardModifiers mod;
mod = event->modifiers();
if(mod & Qt::ShiftModifier){
qDebug("<Shift>被按下");
}
if(mod & Qt::ControlModifier){
qDebug("<Ctrl>被按下");
}
if(mod & Qt::AltModifier){
qDebug("<Alt>被按下");
}
}
4.运行
Starting G:\QTwork\build-Keyborad-Desktop_Qt_5_6_1_MinGW_32bit-Debug\debug\Keyborad.exe...
"按下"
""
按键代码:16777248
扫描键码:42
虚拟键码:16
测试组合按键:
<Shift>被按下
"抬起"
""
按键代码:16777248
扫描键码:42
虚拟键码:16
测试组合按键:
"按下"
"d"
按键代码:68
扫描键码:32
虚拟键码:68
测试组合按键:
"抬起"
"d"