基础情况
在流式系统中,大部分的情况,数据源是从后端准备好后推送到前端的,此时大部分的情形是前端被动的显示后端流化传过来的内容。有一些场景,在前端需要接受用户的操作,从而影响后端的数据内容和表现,此时大部分的行为将通过传统的键盘,鼠标来进行操作或者交互内容。
之前Web前端部分介绍过了,在前端如何处理这些键盘鼠标事件,后端需要针对这些数据,格式的传入进行解析后,在云服务器上真实操作,从而产生实际的效果作用。之后产生的数据才是准确的内容。
个人技术博客: fuqifacai.github.io
更多技术资讯下载: 2img.ai
相关配图由微信小程序【字形绘梦】免费生成

代码讲解
首先来看下头文件中的主要函数内容和作用
#pragma once
#include <myjsoncpp/json/json.h>
namespace QL
{
class QLKeyboardAndMouse
{
public:
QLKeyboardAndMouse(int screenWidth,int screenHeight);
~QLKeyboardAndMouse();
void ProcessKeyboardAndMouseMessage(const uint8_t* data, uint32_t len, bool binary);
void initKeys();
void SetMainWindowForOffset(long uiHander);
void GetUIOffset();
protected:
void codeConversion(Json::Value& json);
void combinationKey(const Json::Value& json);
private:
// 键盘
void OnKeyDwon(const Json::Value& msg);
void OnKeyUp(const Json::Value& json);
// 鼠标
void OnMouseDown(const Json::Value& json);
void OnMouseUp(const Json::Value& json);
// 鼠标移动
void OnMouseMove(const Json::Value& json);
// 鼠标滑轮
void OnMouseWheel(const Json::Value& json);
private:
bool mIsCtrlPressed{ false };
bool mIsShiftPressed{ false };
bool mIsAltPressed{ false };
bool meta_{ false };
//屏幕宽度,外部传入,内部维护
int mScreenWidth;
//屏幕高度,外部传入,内部维护
int mScreenHeight;
//主窗体针对整个屏幕的偏移
long mMainUIHandler;
bool isInProcessMode; //是否在进程模式,此时发送鼠标键盘事件到进程主窗体
//进程内主窗体在整个屏幕空间的左上角偏移。计算鼠标位置时做位置计算用。
float mWinOffsetX;
float mWinOffsetY;
};
}
主要的行为有:
- 当整体的流式运转之后,针对一个用户Session的情况下,我们进行全局键盘和鼠标事件类对象的挂载。从而响应对应的事件,你也可以在其余的位置挂载,因为不同的系统不同的设计。我们目前青龙流式在全局挂载,是因为就在一个全局位置开启和关闭。
- 如果是多Session的情况下,因为要模拟不同用户的Session情况,不同的Session对应不同的键盘和鼠标,全局挂载一个是不行的。青龙系统曾经尝试支持这种情形,但后来发现这种基于软件Session的隔离机制,对于软件产品系统层级过于复杂了,这个后续倾向于让操作系统层面或对等软件层面去解决。比如通过Docker,VM等机制完全的隔离较好。当然甚至可以参考XRDPServer等。
- 单独考虑单用户Session的情况下,主要的函数有键盘的KeyPress, KeyDown , KeyUp,MouseDown, MouseMove, MouseUp 。这些函数的回调,或者Call都会根据不同的OS实现一份。 在青龙流式的系统中,我们基本上实现了Windows, Linux 2个平台。
- 考虑到组合按键的情况,特定用CombineKey函数进行处理。
剩余内容需解锁后查看
Paragoger衍生者AI训练营。发布者:稻草人,转载请注明出处:https://www.shxcj.com/archives/6600