WIN版手机充当电脑蓝牙键盘适配器

news/2024/11/24 14:06:56/

第二标题:SOCKET通讯与SENINPUT发送键盘消息
by the way,其实大部分代码都是抄抄抄,拼凑出来的简陋作品,连隐藏黑窗口都没做,高手们别见笑
咳咳,言归正传,事情起因是这样的——
PC用的键盘是五年前的普通键盘,久了不好用,经常卡涩,恰好手头有一把蓝牙键盘,原本是买来应急,想在手机上敲键盘用的,然而……吃灰了许久
但是,有键盘,却发现没有插电脑上接收蓝牙信号的适配器,以前有过一个不知何时没了……
买一个也不贵,但手里旧手机两部,明明都有蓝牙功能,却不能利用起来,也太浪费了!!!
一开始的想法,是直接手机插电脑上,把手机的键盘信号存到文件,再从电脑这边读取手机的文件,很简单的IO操作就能完成,然而旧手机连接起来有点毛病,有时候会断……
恰好有个大佬提建议,用SOCKET!
这东西原本只是知道点原理,具体的从来没用过,也没怎么学过,搜了一下,发现还挺简单的,linux和win上都成功实现,这里贴上win平台上的伺听端代码
补充说明:作为服务器听取端,是在第一级路由上的,手机在第二级路由的WIFI上时,能连接,反过来或者其他情况行不行,不确定

#include <QCoreApplication>
#include <winsock.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include <winuser.h>
#include <windows.h>
//#pragma comment (lib, "ws2_32.lib") 用QT敲的,这个连接在设置里弄
#define SERVER_PORT 12341int main(int argc, char *argv[])
{QCoreApplication a(argc, argv);//初始化 DLLWSADATA wsaData;WSAStartup(MAKEWORD(2, 2),&wsaData);//创建套接字SOCKET servSock = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);if(servSock == INVALID_SOCKET){perror("faild socket");return 0;}//绑定套接字sockaddr_in sockAddr;memset(&sockAddr, 0, sizeof(sockAddr)); //每个字节都用0填充sockAddr.sin_family = PF_INET; //使用IPv4地址sockAddr.sin_addr.s_addr = inet_addr("192.168.0.118"); //具体的IP地址sockAddr.sin_port = htons(SERVER_PORT); //端口if(bind(servSock, (SOCKADDR*)&sockAddr, sizeof(SOCKADDR)) == -1){printf("bind faild : %d",WSAGetLastError());return 0;}//进入监听状态int lisb = listen(servSock, 20);printf("listen return:%d\n",lisb);while(1){//接收客户端请求SOCKADDR clntAddr;int nSize = sizeof(SOCKADDR);SOCKET clntSock = accept(servSock, (SOCKADDR*)&clntAddr, &nSize);if(clntSock == INVALID_SOCKET)continue;elseprintf("get clint!");char buffer[200] = {0};int grecv = recv(clntSock,buffer,sizeof(buffer),0);if(strlen(buffer)>4){char kvalue[5]={0};//我用up down表明松开、按下int kcode;//手机转发出来的keycodesscanf(buffer,"%[^' '] %d",kvalue,&kcode);//sscanf是真的好用,匹配读取int kivalue = strlen(kvalue)>=4?0:1;//判断按下松开,用0,1表示skbmsg(kivalue,trascode(kcode));//传递给发送键盘信号的函数printf("%s,%d",kvalue,kcode);}//关闭套接字closesocket(clntSock);}closesocket(servSock);//终止 DLL 的使用WSACleanup();return 0;return a.exec();
}

上面大半的注释都是照抄的,连代码一起【doge】
循环接受连接并读取键盘消息后,就得转成电脑端的键盘消息了,代码如下(其实应该是“如上”,C嘛……)——

\\第一个函数,把手机KEYCODE部分不一样的转成PC系统用的标准码,这个参考意义不大,恰好跟我一样蛋疼想这么玩的,得自己试试各个键码,对照标准码
int trascode(int rgkecode)
{int result = rgkecode;switch (rgkecode) {case 16777216:        result = 112;        break;case 16777376:        result = 113;        break;case 45:              result = 189;        break;case 16777469:        result = 115;        break;case 16777362:        result = 116;        break;case 16777346:        result = 118;        break;case 16777344:        result = 119;        break;case 16777347:        result = 120;        break;case 16777329:        result = 121;        break;case 61:              result = 187;        break;case 16777219:        result = 8;          break;case 16777217:        result = 9;         break;case 16777252:        result = 20;        break;case 16777248:        result = 16;        break;case 16777249:        result = 17;        break;case 16777251:        result = 18;        break;case 16777220:        result = 13;        break;case 16777235:        result = 38;        break;case 16777237:        result = 40;        break;case 16777234:        result = 37;        break;case 16777236:        result = 39;        break;case 96:        result = 192;        break;case 44:        result = 188;        break;case 46:        result = 190;        break;case 47:        result = 191;        break;case 59:        result = 186;        break;case 39:        result = 222;        break;case 91:        result = 219;        break;case 93:        result = 221;        break;case 92:        result = 220;        break;default:break;}return result;
}//吐槽一个,微软用SENDINPUT取代KEYEVEN,是因为后者会出BUG么……我原本是想用KEYEVEN的,然而出现严重的BUG,哪怕程序终止了,BUG现象还在
void skbmsg(int kvalue,int kcode)
{INPUT input[1];memset(input,0,sizeof(INPUT));input[0].type = INPUT_KEYBOARD;//表明为键盘事件input[0].ki.wVk = kcode;//键码if(kvalue)//如果没有下面这句,默认是按下input[0].ki.dwFlags = KEYEVENTF_KEYUP;SendInput(1,input,sizeof(INPUT));
//这个函数更多的相关知识,有兴趣的就自己百度\BING\GOOGLE了
}

手机端的代码得等我切换到deepin上,我在linux-deepin上用QT敲的,不过下篇不会有LINUX端的代码
——因为没成功……
没搞定给系统发送键盘信号这个关键部分,尝试用 open\write /dev/input/…… 失败了


http://www.ppmy.cn/news/562619.html

相关文章

你所不知道的蓝牙适配器的好处

你所不知道的蓝牙适配器的好处 目前办公室和家里的各种设备逐渐增多&#xff0c;各种数据线几乎要把我们的办公桌占满了&#xff0c;不仅摆放麻烦&#xff0c;要使用某个设备的时候还要亲自动手去插拔。 有了蓝牙适配器&#xff0c;没有蓝牙的台式电脑就可以直接连接蓝牙鼠标、…

Android 经典蓝牙(Classic Bluetooth)和低功耗蓝牙(BLE)

从蓝牙4.0开始包含两个蓝牙芯片模块&#xff1a;传统/经典蓝牙模块&#xff08;Classic Bluetooth,简称BT&#xff09;和低功耗蓝牙&#xff08;Bluetooth Low Energy,简称BLE&#xff09; 经典蓝牙是在之前的蓝牙1.0,1.2,2.0 EDR,2.1 EDR,3.0 EDR等基础上发展和完善起来的&am…

基于富芮坤fr8016 蓝牙5.0 芯片设计的BLE HID Joystick 游戏摇杆设备

文章目录 ble hid 学习笔记HID报告描述符与BLE HID profile之间关系1、HID报告描述符 富芮坤fr8016 设计Joystick例子1、描述X轴Y轴Z轴2、描述按钮3、Joystick 报告描述符4、程序修改5、win10测试6、android 测试 总结 ble hid 学习笔记 HID报告描述符与BLE HID profile之间关…

2023-06-25 LeetCode每日一题(圆和矩形是否有重叠)

2023-06-25每日一题 一、题目编号 1401. 圆和矩形是否有重叠二、题目链接 点击跳转到题目位置 三、题目描述 给你一个以 (radius, xCenter, yCenter) 表示的圆和一个与坐标轴平行的矩形 (x1, y1, x2, y2) &#xff0c;其中 (x1, y1) 是矩形左下角的坐标&#xff0c;而 (x2…

【PCB专题】Allegro中设置泪滴

PCB绘制完成后有时按需要对PCB进行添加泪滴的操作是非常必要的。 添加泪滴的作用主要是: 信号传输时平滑阻抗,减少阻抗的急剧跳变,避免高频信号传输时由于线宽突然变小而造成反射。 焊接时可以保护焊盘,避免多次焊接时焊盘的脱落,生产时可以避免蚀刻不均,以及过孔偏位出…

ViewModel进阶 | 使用SavedState实现数据复用的另一种方式

前言&#xff1a;金风玉露一相逢&#xff0c;便胜人间无数。 前言 本文需要有上一篇文章基础&#xff0c;如果不了解的可以先看看《由浅入深&#xff0c;ViewModel配置变更的复用详解》 前面我们了解到&#xff0c;ViewModel 它只能做到因为配置变更页面被销毁而导致重建数据…

人工智能技术与GIS结合的发展

个人本是GIS专业出身&#xff0c;不知名985高校本硕。工作几年后先后积累了国土空间规划、cesium开发、地理信息数据采集、地理大数据处理&#xff0c;遥感影像处理、人工智能识别&#xff0c;做过十多个500万以上的相关项目&#xff0c;有一些浅薄的经验&#xff0c;想和大家分…

伪娘之男扮女装

>>伪娘 伪娘&#xff0c;是一个ACG界名词(动画、漫画、游戏)&#xff0c;通常指的是男扮女装且有女性美貌的男性角色&#xff0c;变装后常常带有很强的萌属性&#xff0c;有的可能更胜过一般女性角色&#xff0c;在日本年轻男性中正在兴起一种女装男子的“伪娘”热。聘用…