c语言编写按键触发事件函数,可检测按下、抬起,长按以及保持事件
时间: 2024-05-13 18:21:04 浏览: 25
以下是一种按键触发事件函数的实现方式,可检测按下、抬起、长按以及保持事件。
```c
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <Windows.h>
#define KEY_UP 0x48
#define KEY_DOWN 0x50
#define KEY_LEFT 0x4B
#define KEY_RIGHT 0x4D
#define KEY_ENTER 0x0D
#define KEY_ESC 0x1B
bool key_pressed(int key_code) {
return (GetAsyncKeyState(key_code) & 0x8000) != 0;
}
void key_event_handler(int key_code, void (*on_press)(), void (*on_release)(), void (*on_hold)()) {
bool pressed = false;
DWORD press_time = 0;
DWORD hold_time = 0;
while (true) {
if (key_pressed(key_code)) {
if (!pressed) {
pressed = true;
press_time = GetTickCount();
if (on_press != NULL) {
on_press();
}
} else {
DWORD elapsed = GetTickCount() - press_time;
if (on_hold != NULL && elapsed >= hold_time) {
hold_time += 100;
on_hold();
}
}
} else {
if (pressed) {
pressed = false;
hold_time = 0;
if (on_release != NULL) {
on_release();
}
}
}
Sleep(10);
}
}
void move_up() {
printf("Move up\n");
}
void move_down() {
printf("Move down\n");
}
void move_left() {
printf("Move left\n");
}
void move_right() {
printf("Move right\n");
}
void select_item() {
printf("Select item\n");
}
void cancel_operation() {
printf("Cancel operation\n");
}
int main() {
printf("Press arrow keys, enter or esc to trigger events.\n");
key_event_handler(KEY_UP, move_up, NULL, NULL);
key_event_handler(KEY_DOWN, move_down, NULL, NULL);
key_event_handler(KEY_LEFT, move_left, NULL, NULL);
key_event_handler(KEY_RIGHT, move_right, NULL, NULL);
key_event_handler(KEY_ENTER, select_item, NULL, NULL);
key_event_handler(KEY_ESC, cancel_operation, NULL, NULL);
return 0;
}
```
在上面的代码中,我们定义了一些常量来表示不同的按键值,例如 `KEY_UP` 表示上箭头键,`KEY_ENTER` 表示回车键等等。`key_pressed` 函数用来检测某个按键是否被按下,返回值为 true 表示按下,false 表示未按下。`key_event_handler` 函数是按键事件处理函数,它接受三个回调函数:`on_press` 表示按键按下时触发的事件,`on_release` 表示按键抬起时触发的事件,`on_hold` 表示按键长按时触发的事件。
在函数中,我们使用一个 while 循环来不断检测按键状态。当按键被按下时,我们首先检查是否是第一次按下,如果是,则记录按下时间,并触发 `on_press` 回调函数。如果不是第一次按下,则计算按下时间,并检查是否需要触发 `on_hold` 回调函数。当按键被抬起时,我们同样检查是否是第一次抬起,如果是,则触发 `on_release` 回调函数。
在主函数中,我们使用 `key_event_handler` 函数来注册不同的按键事件处理函数。当用户按下相应的按键时,对应的事件处理函数就会被触发。这里我们示例了一些简单的事件处理函数,例如移动方向、选择项目和取消操作等。你可以根据自己的需求来编写相应的事件处理函数。
相关推荐
![rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)