第三十三章 后端的鼠标键盘等事件实现

基础情况

在流式系统中,大部分的情况,数据源是从后端准备好后推送到前端的,此时大部分的情形是前端被动的显示后端流化传过来的内容。有一些场景,在前端需要接受用户的操作,从而影响后端的数据内容和表现,此时大部分的行为将通过传统的键盘,鼠标来进行操作或者交互内容。

之前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;

        };

}

主要的行为有:

  1. 当整体的流式运转之后,针对一个用户Session的情况下,我们进行全局键盘和鼠标事件类对象的挂载。从而响应对应的事件,你也可以在其余的位置挂载,因为不同的系统不同的设计。我们目前青龙流式在全局挂载,是因为就在一个全局位置开启和关闭。
  2. 如果是多Session的情况下,因为要模拟不同用户的Session情况,不同的Session对应不同的键盘和鼠标,全局挂载一个是不行的。青龙系统曾经尝试支持这种情形,但后来发现这种基于软件Session的隔离机制,对于软件产品系统层级过于复杂了,这个后续倾向于让操作系统层面或对等软件层面去解决。比如通过Docker,VM等机制完全的隔离较好。当然甚至可以参考XRDPServer等。
  3. 单独考虑单用户Session的情况下,主要的函数有键盘的KeyPress, KeyDown , KeyUp,MouseDown, MouseMove, MouseUp 。这些函数的回调,或者Call都会根据不同的OS实现一份。 在青龙流式的系统中,我们基本上实现了Windows, Linux 2个平台。
  4. 考虑到组合按键的情况,特定用CombineKey函数进行处理。
剩余内容需解锁后查看

您需要付费解锁才能查看当前内容

VIP会员免费
已付费?登录刷新

Paragoger衍生者AI训练营。发布者:稻草人,转载请注明出处:https://www.shxcj.com/archives/6600

(0)
上一篇 2024-09-30 2:39 下午
下一篇 2024-09-30 2:42 下午

相关推荐

发表回复

登录后才能评论
本文授权以下站点有原版访问授权 https://www.shxcj.com https://www.2img.ai https://www.2video.cn