基于Easyx实现同时接收键盘鼠标消息

利用C++11结合Easyx简单实现并发接收键盘鼠标消息


说明:本示例开发环境为vs2019 & 且需要C++11语法支持,旨在帮助初学者能够以更便捷的方式使用IO设备。

头文件中的两个监听器专门用于监听鼠标、键盘消息。

两个监听器的参数均为函数指针,因此事件触发后具体执行哪些事情完全由你来决定。你只需要编写两个对应的处理函数并且其传递给对应的监听器即可。

鼠标处理函数声明式:void deal_mousefunc(MOUSEMSG mouse_data);
键盘处理函数声明式:void deal_keyfunc(int keyboard_data);
具体请参考示例程序。


函数接口以及必要的函数类型定义:

IODevice.h:

#ifndef __IODEVICE__
#define __IODEVICE__
#include <graphics.h>
#include <conio.h>
#include <thread>
#include <memory>
typedef void deal_keyfunc(int);
typedef void deal_mousefunc(MOUSEMSG);

/*
* @function: 开辟一个新线程,用以监听键盘事件,考虑到避免内存泄漏,我们将新开辟的线程对象以unique_ptr封装返回。
* 对捕获到鼠标数据将其交于参数中的函数处理。
* @return value:指向开辟的新线程对象的一个unique_ptr;
* @第一参数:接收到鼠标数据后的处理函数(func pointer..),用于处理来自鼠标的数据
* for example:
*	void deal_key_func(int key_data){...}//对接收到的鼠标数据进行处理
*	auto thread_1 = listening_mouse(deal_mouse_func);
**/
std::unique_ptr<std::thread> listening_mouse(deal_mousefunc* func);

/*
* @function: 开辟一个新线程,用以监听鼠标事件,考虑到避免内存泄漏,我们将新开辟的线程对象以unique_ptr封装返回。
* @return value:指向开辟的新线程对象的一个unique_ptr;
* @第一参数:接收到键盘数据后的处理函数(func pointer..),用于处理来自键盘的数据
* for example:
*	void deal_key_func(int from_key_data){...}//对接收到的键盘数据进行处理
*	auto thread_2 = listening_key(deal_key_func);
*/
std::unique_ptr<std::thread> listening_key(deal_keyfunc* func);

#endif // __IODEVICE__

IODevice.cpp:

#include "IODevice.h"

std::unique_ptr<std::thread> listening_mouse(deal_mousefunc* func) {
	//Create a new thread...
	std::unique_ptr<std::thread> u_ptr(new std::thread([func]() {
		//loop listening the message from mouse.
		while (1)
		{
			while (!MouseHit()) std::this_thread::yield();
			func(GetMouseMsg());
		}
		}));
	u_ptr->detach();
	return u_ptr;
}

std::unique_ptr<std::thread> listening_key(deal_keyfunc* func) {
	//Create a new thread...
	std::unique_ptr<std::thread> u_ptr(new std::thread([func]() {
		//loop listening the message from keyboard.
		while (1) {
			while (!_kbhit()) std::this_thread::yield();
			func(_getch());
		}
		}));
	u_ptr->detach();
	return u_ptr;
}

程序示例:

#include <easyx.h>
#include <stdio.h>
#include <graphics.h>
#include "IODevice.h"

//键盘响应处理函数(这里由你根据自己的需要的功能自定义即可,我们只需将其传递给键盘监听器)----------------------->
void deal_key_func(int key_data) {
	LOGFONT f;
	gettextstyle(&f);						// 获取当前字体设置
	f.lfHeight = 20;						// 设置字体高度
	wcscpy_s(f.lfFaceName, _T("黑体"));		// 设置字体为“黑体”(高版本 VC 推荐使用 _tcscpy_s 函数)
	f.lfQuality = ANTIALIASED_QUALITY;		// 设置输出效果为抗锯齿  
	settextstyle(&f);						// 设置字体样式
	switch (key_data)
	{
	case 'w':
		outtextxy(100, 100, _T("I push button: w"));
		break;
	case 'a':
		outtextxy(100, 100, _T("I push button: a"));
		break;
	case 'd':
		outtextxy(100, 100, _T("I push button: d"));
		break;
	case 's':
		outtextxy(100, 100, _T("I push button: s"));
		break;
	default:
		break;
	}
}

//鼠标响应处理函数(这里由你根据自己的需要的功能自定义即可,我们只需将其传递给鼠标监听器)---------------------->
void deal_mouse_func(MOUSEMSG mouse_message) {
	TCHAR message__[100];
	settextcolor(BLACK);
	if (mouse_message.uMsg == WM_MOUSEMOVE)
	{
		swprintf_s(message__, _T("Mouse coordinate is: [%d,%d]"), mouse_message.x, mouse_message.y);
		outtextxy(0, 0, message__);
	}
}

int main()
{
	initgraph(1200, 780);
	setbkcolor(WHITE);
	cleardevice();
	settextcolor(BLACK);
	auto thread1 = listening_key(deal_key_func);	//这里调用键盘监听器并将自定义的处理函数传递过来
	auto thread2 = listening_mouse(deal_mouse_func);//这里调用鼠标监听器并将自定义的处理函数传递过来
	while (1);
	return 0;
}

运行结果:
在这里插入图片描述

  • 3
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

@梅哲仁.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值