简单远程控制(仅传递鼠标和键盘消息)的实现

2023-11-05

假设两个同样的应用程序,运行在相同的操作系统上,要实现远程控制,可以使用传递鼠标和键盘的消息给对方,对方收到后解析出鼠标和键盘消息如何执行即可。


下面是几处关键程序:


一是处理收到消息,下面应该放在套接字接收或者串口接收中:(小心下面的右键单击、双击几处没实现!)

//
// 解析从客户端发送过来的消息并发送到本机的消息队列
//
void DispatchWMMessage(char *szString, void *p)
{
	CTestDlg *pDlg = (CTestDlg *)p;

	//鼠标消息
	struct {char *szWMMouseMsg;} 
	WMMouseMsg[] = {"WM_MM","WM_LBD","WM_LBU","WM_LBK",
					"WM_MBD","WM_MBU","WM_MBK",
					"WM_RBD","WM_RBU","WM_RBK"};

	// 键盘消息
	struct {char *szWMKeyBdMsg;}
	WMKeyBdMsg[] = {"WM_KD","WM_KU"};

	// 通用消息:色彩模式,网格数和压缩消息
	struct {char *szMsg;}
	Msg[] = {"WM_COMP","WM_GRID","WM_CMOD"};

	int		nWMMouseMsg;
	int		nWMKeyBdMsg;
	int		nMsg;

	struct	CommandList	CommandStart;
	struct	CommandList	*pCommandNode;
	struct	CommandDS	Command;
	char	*pDest;
	int		iLoc,nChar;
	int		iLoop,iParms;
	char	szString2[2049];

	// 分别得到鼠标,键盘,通用消息的数目
	nWMMouseMsg = (int)(sizeof(WMMouseMsg)/sizeof(WMMouseMsg[0]));
	nWMKeyBdMsg = (int)(sizeof(WMKeyBdMsg)/sizeof(WMKeyBdMsg[0]));
	nMsg = (int)(sizeof(Msg)/sizeof(Msg[0]));

	// 初始化command链表
	CommandStart.pNext = NULL;
	pCommandNode = &CommandStart;

	// 分析command命令,截获命令的参数
	iParms = 0;
	while (pDest = strchr(szString,';'))
	{
		iLoc = pDest - szString;
		nChar = iLoc;
		memset(Command.szElement,'\0',sizeof(Command.szElement));
		strncpy(Command.szElement,szString,nChar);
		// 发送到命令栈中
		pCommandNode = Add_Command(pCommandNode,Command);
		memset(szString2,'\0',sizeof(szString2));
		strcpy(szString2,&szString[iLoc + 1]);
		strcpy(szString,szString2);

		iParms++;
		if (iParms == 5) // 每条命令5个参数
			break;
	}

	// 处理命令
	pCommandNode = CommandStart.pNext;
	if (pCommandNode)
	{
		// 鼠标消息
		UINT	keyFlags;
		int		iMessage;
		int		fWMMouseMsg;
		DWORD	dwX,dwY;

		// 键盘消息
		int		fWMKeyBdMsg;
		UINT	vk;
		int		fDown;
		int		cRepeat;
		UINT	flags;

		// 判断是否有鼠标消息
		fWMMouseMsg = FALSE;
		for (iLoop = 0;iLoop < nWMMouseMsg;iLoop++)
		{
			if (strcmp(pCommandNode->Command.szElement,WMMouseMsg[iLoop].szWMMouseMsg) == 0)
			{
				// 设置鼠标消息的标志
				fWMMouseMsg = TRUE;
				// 具体的鼠标消息
				if (strcmp(WMMouseMsg[iLoop].szWMMouseMsg,"WM_MM\0") == 0)
					iMessage = 1;
				else if (strcmp(WMMouseMsg[iLoop].szWMMouseMsg,"WM_LBD\0") == 0)
					iMessage = 2;
				else if (strcmp(WMMouseMsg[iLoop].szWMMouseMsg,"WM_LBU\0") == 0)
					iMessage = 3;
				else if (strcmp(WMMouseMsg[iLoop].szWMMouseMsg,"WM_LBK\0") == 0)
					iMessage = 4;
				else if (strcmp(WMMouseMsg[iLoop].szWMMouseMsg,"WM_MBD\0") == 0)
					iMessage = 5;
				else if (strcmp(WMMouseMsg[iLoop].szWMMouseMsg,"WM_MBU\0") == 0)
					iMessage = 6;
				else if (strcmp(WMMouseMsg[iLoop].szWMMouseMsg,"WM_MBK\0") == 0)
					iMessage = 7;
				else if (strcmp(WMMouseMsg[iLoop].szWMMouseMsg,"WM_RBD\0") == 0)
					iMessage = 8;
				else if (strcmp(WMMouseMsg[iLoop].szWMMouseMsg,"WM_RBU\0") == 0)
					iMessage = 9;
				else if (strcmp(WMMouseMsg[iLoop].szWMMouseMsg,"WM_RBK\0") == 0)
					iMessage = 10;

				// 移动到参数栈的下一个节点,x坐标
				pCommandNode = pCommandNode->pNext;
				dwX = (DWORD)atof(pCommandNode->Command.szElement);

				// 移动到参数栈的下一个节点,y坐标
				pCommandNode = pCommandNode->pNext;
				dwY = (DWORD)atof(pCommandNode->Command.szElement);

				// 移动到参数栈的下一个节点,辅助键
				pCommandNode = pCommandNode->pNext;
				keyFlags = atoi(pCommandNode->Command.szElement);

				// 退出循环
				break;
			}
		}

		// 如果有鼠标消息则对鼠标消息进行处理
		if (fWMMouseMsg)
		{
			// 处理鼠标消息
			if (iMessage == 1) //光标移动
			{
				//mouse_event(MOUSEEVENTF_ABSOLUTE|MOUSEEVENTF_MOVE,0,0,0,0);
				SetCursorPos(dwX,dwY);	
			}
			else if (iMessage == 2) //左键按下
			{
				mouse_event(MOUSEEVENTF_ABSOLUTE|MOUSEEVENTF_LEFTDOWN,0,0,0,0);
			}
			else if (iMessage == 3) //左键抬起
			{
				mouse_event(MOUSEEVENTF_ABSOLUTE|MOUSEEVENTF_LEFTUP,0,0,0,0);
			}
			//以下鼠标的消息还未处理!!!
			else if (iMessage == 4) 
			{
				mouse_event(MOUSEEVENTF_ABSOLUTE|MOUSEEVENTF_LEFTDOWN,0,0,0,0);
				mouse_event(MOUSEEVENTF_ABSOLUTE|MOUSEEVENTF_LEFTUP,0,0,0,0);
				mouse_event(MOUSEEVENTF_ABSOLUTE|MOUSEEVENTF_LEFTDOWN,0,0,0,0);
				mouse_event(MOUSEEVENTF_ABSOLUTE|MOUSEEVENTF_LEFTUP,0,0,0,0);
			}
			else if (iMessage == 5) 
			{
				mouse_event(MOUSEEVENTF_ABSOLUTE|MOUSEEVENTF_MIDDLEDOWN,0,0,0,0);
			}
			else if (iMessage == 6) 
			{
				mouse_event(MOUSEEVENTF_ABSOLUTE|MOUSEEVENTF_MIDDLEUP,0,0,0,0);
			}
			else if (iMessage == 7) 
			{
				mouse_event(MOUSEEVENTF_ABSOLUTE|MOUSEEVENTF_MIDDLEDOWN,0,0,0,0);
				mouse_event(MOUSEEVENTF_ABSOLUTE|MOUSEEVENTF_MIDDLEUP,0,0,0,0);
				mouse_event(MOUSEEVENTF_ABSOLUTE|MOUSEEVENTF_MIDDLEDOWN,0,0,0,0);
				mouse_event(MOUSEEVENTF_ABSOLUTE|MOUSEEVENTF_MIDDLEUP,0,0,0,0);
			}
			else if (iMessage == 8) 
			{
				mouse_event(MOUSEEVENTF_ABSOLUTE|MOUSEEVENTF_RIGHTDOWN,0,0,0,0);
			}
			else if (iMessage == 9) 
			{
				mouse_event(MOUSEEVENTF_ABSOLUTE|MOUSEEVENTF_RIGHTUP,0,0,0,0);
			}
			else if (iMessage == 10)
			{
				mouse_event(MOUSEEVENTF_ABSOLUTE|MOUSEEVENTF_RIGHTDOWN,0,0,0,0);
				mouse_event(MOUSEEVENTF_ABSOLUTE|MOUSEEVENTF_RIGHTUP,0,0,0,0);
				mouse_event(MOUSEEVENTF_ABSOLUTE|MOUSEEVENTF_RIGHTDOWN,0,0,0,0);
				mouse_event(MOUSEEVENTF_ABSOLUTE|MOUSEEVENTF_RIGHTUP,0,0,0,0);
			}
		}
		else
		{
			// 没有鼠标消息则判断是否有键盘消息
			fWMKeyBdMsg = FALSE;
			for (iLoop = 0;iLoop < nWMKeyBdMsg;iLoop++)
			{
				if (strcmp(pCommandNode->Command.szElement,WMKeyBdMsg[iLoop].szWMKeyBdMsg) == 0)
				{
					// 设置键盘消息标志
					fWMKeyBdMsg = TRUE;
					if (strcmp(WMKeyBdMsg[iLoop].szWMKeyBdMsg,"WM_KD\0") == 0)
						iMessage = 1;//按下键
					else if (strcmp(WMKeyBdMsg[iLoop].szWMKeyBdMsg,"WM_KU\0") == 0)
						iMessage = 2;//松开键

					// 移动到参数链表的下一个节点,Virtural 键码
					pCommandNode = pCommandNode->pNext;
					vk = atoi(pCommandNode->Command.szElement);

					//移动到参数链表的下一个节点,按下键标志
					pCommandNode = pCommandNode->pNext;
					fDown = atoi(pCommandNode->Command.szElement);

					// 移动到参数链表的下一个节点,按键重复数
					pCommandNode = pCommandNode->pNext;
					cRepeat = atoi(pCommandNode->Command.szElement);

					// 移动到参数链表的下一个节点,标志位
					pCommandNode = pCommandNode->pNext;
					flags = atoi(pCommandNode->Command.szElement);

					break;
				}
			}

			// 如果有键盘消息,则处理键盘消息
			if (fWMKeyBdMsg)
			{
				if (iMessage == 1) //模拟按键消息
				{
					keybd_event((BYTE)vk,(BYTE)vk,0,0);
				}
				else if (iMessage == 2) //模拟松开键的消息
				{
					keybd_event((BYTE)vk,(BYTE)vk,KEYEVENTF_KEYUP,0);
				}
			}
			else // 通用消息
			{
				for (iLoop = 0;iLoop < nMsg;iLoop++)
				{
					if (strcmp(pCommandNode->Command.szElement,Msg[iLoop].szMsg) == 0)
					{
						if (strcmp(Msg[iLoop].szMsg,"WM_COMP\0") == 0)
						{
							// 移动到参数链表的下一个节点,压缩级数
							pCommandNode = pCommandNode->pNext;
							//iCompressionLevel = atoi(pCommandNode->Command.szElement);
						}
						else if (strcmp(Msg[iLoop].szMsg,"WM_GRID\0") == 0)
						{
							// 移动到参数链表的下一个节点,x网格数
							pCommandNode = pCommandNode->pNext;
							//nGridX = atoi(pCommandNode->Command.szElement);

							// 移动到参数链表的下一个节点,y网格数
							pCommandNode = pCommandNode->pNext;
							//nGridY = atoi(pCommandNode->Command.szElement);

							// 清除当前的显示设置
							//ClearDisplay(hServerWnd);
							// 初始化新的显示设置
							//InitDisplay(hServerWnd);
						}
						else if (strcmp(Msg[iLoop].szMsg,"WM_CMOD\0") == 0)
						{
							// 移动到参数链表的下一个节点,每个屏幕点的字节数
							pCommandNode = pCommandNode->pNext;
							//bmBitsPixel = atoi(pCommandNode->Command.szElement);

							//ClearDisplay(hServerWnd);
							//InitDisplay(hServerWnd);
						}
					}
				}
			}
		}
	}
	// 清除命令队列
	Clear_Command(&CommandStart);
}



// 添加一个元素到命令栈中
struct CommandList *Add_Command(struct CommandList *pNode,struct CommandDS Command)
{
	if (pNode->pNext = (struct CommandList *)malloc(sizeof(struct CommandList)))
	{
		pNode = pNode->pNext;
		strcpy(pNode->Command.szElement,Command.szElement);
		pNode->pNext = NULL;
		return pNode;
	}
	return NULL;
}

//完全清除命令栈元素
void Clear_Command(struct CommandList *pStart)
{
	struct	CommandList	*pPrev;
	struct	CommandList	*pNode;
	while (pNode = pStart->pNext)
	{
		pPrev = pStart;
		pPrev->pNext = pNode->pNext;
		free(pNode);
	}
}


二是发送处代码,可以放在主对话框(窗口)的PreTranslateMessage,也可以放在App的PreTranslateMessage中:

BOOL CTestDlg::PreTranslateMessage(MSG* pMsg) 
{
	if (pMsg->message == WM_LBUTTONDOWN)//左键按下
	{
		if(m_bSend)
		{
			CPoint pt;
			GetCursorPos(&pt);

			memset(szMsg,'\0',sizeof(szMsg));
			sprintf(szMsg,"WM_LBD;%d;%d;%d;0;\0",pt.x, pt.y, keyFlags);
			LanSend(szMsg, strlen(szMsg));
		}
	}
	else if (pMsg->message == WM_LBUTTONUP)//左键抬起
	{
		if(m_bSend)
		{
			CPoint pt;
			GetCursorPos(&pt);
			
			memset(szMsg,'\0',sizeof(szMsg));
			sprintf(szMsg,"WM_LBU;%d;%d;%d;0;\0",pt.x, pt.y, keyFlags);
			
			LanSend(szMsg, strlen(szMsg));
		}
	}
	else if (pMsg->message == WM_MOUSEMOVE)	//光标移动
	{
		if(m_bSend)
		{
			POINT pt;
			::GetCursorPos(&pt);
			memset(szMsg,'\0',sizeof(szMsg));
			//sprintf(szMsg,"WM_MM;%d;%d;%d;0;\0", GET_X_LPARAM(pMsg->lParam), GET_Y_LPARAM(pMsg->lParam), 0);
			sprintf(szMsg,"WM_MM;%d;%d;%d;0;\0", pt.x, pt.y, 0);
			LanSend(szMsg, strlen(szMsg));
			return FALSE;
		}
	}
	else if (pMsg->message == WM_KEYDOWN)	//键盘按下
	{
		if(m_bSend)
		{
			memset(szMsg,'\0',sizeof(szMsg));
			sprintf(szMsg,"WM_KD;%d;%d;%d;%d;\0",pMsg->wParam, 0, 0, 0);
			LanSend(szMsg, strlen(szMsg));
		}
	}
	else if (pMsg->message == WM_KEYUP)		//键盘抬起
	{
		if(m_bSend)
		{
			memset(szMsg,'\0',sizeof(szMsg));
			sprintf(szMsg,"WM_KU;%d;%d;%d;%d;\0",pMsg->wParam, 0, 0, 0);
			LanSend(szMsg, strlen(szMsg));
		}
	}

	return CDialog::PreTranslateMessage(pMsg);
}

上述的LanSend是套接字发送(或者是串口发送)函数。




本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

简单远程控制(仅传递鼠标和键盘消息)的实现 的相关文章

  • Java使用POI操作Excel合并单元格

    合并单元格的方法 指定 4 个参数 起始行 结束行 起始列 结束列 然后这个区域将被合并 CellRangeAddress region new CellRangeAddress startRow endRow startCol endCo
  • 某站webpack打包JS逆向,keyCipher、keySM2Cipher参数分析

    文章目录 前言 一 抓包分析 二 参数解析 1 加密定位 2 参数分析 三 响应解密 1 加密定位 总结 前言 今天来水一篇文章 某站webpack打包类型 登录 数据解密参数keyCipher keySM2Cipher 本文章仅供学习研究
  • 11. 实战:bs4法抓取网页图片并保存到本地文件夹

    前言 我们通过前面几节的学习已经了解到bs4模块对于我们抓取网页的方便之处 也通过一个实例实践了抓取某网站菜价 本节我们以某图片网为例 链接放评论区 实现抓取唯美壁纸栏目的内容并保存到本地文件夹 目标 思路 1 获取所有子页面链接地址 2
  • 数据库系统之函数依赖

    Functional Dependencies 什么是函数依赖 如何发现关系表中的函数依赖关系 函数依赖关系与对象的类 功能依赖与关联 函数依赖性的派生 阿姆斯特朗公理 Armstrong axioms 其他的推理规则 References
  • python如何学习(三)

    最近开始整理python的资料 博主建立了一个qq群 希望给大家提供一个交流的同平台 78486745 一 第一个Python程序 HelloWorld python的第一个程序也从hello world开始吧 usr bin env py
  • linux ipv6内核编译,linux ipv6内核设置

    linux ipv6内核设置 进入 proc sys net ipv6 conf all forwarding Type BOOLEAN 在两个接口之间进行global IPv6 forwarding 数据包转发 IPv6 当中您不能单独控
  • 使用 tf-idf 提取关键词

    tf idf 的简要介绍 tf term frequency 某个关键词在整篇文档中出现的频率 idf inverse document frequency 逆文档频率 某个词在所有文档中出现的频率 tf 公式 t f i j n i j
  • [C++11] nullptr 和 NULL

    在工作中 避免产生 野指针 最有效的方法 是以下两点 1 在定义指针的同时完成初始化操作 即便该指针的指向尚未明确 也要将其初始化为空指针 2 在delete释放该指针后 对该指针赋值为空指针 C 11 新增关键字 nullptr 专门用来
  • jmeter之接口数据与数据库数据检验!

    前言 本文讲解使用jmeter测试接口 然后与数据库里面的数据进行校验对比 本节使用一个新增数据的接口 新增一条数据 然后在数据库里面进行查询 是否能够查询到此条数据 一 接口环境搭建 1 1 新建一个http请求 写好请求的内容 我的大概
  • JavaEE 笔记03:基于Vue,SpringBoot的前后端分离的简单作业管理系统

    基于Vue SpringBoot的前后端分离的简单作业管理系统 目录 基于Vue SpringBoot的前后端分离的简单作业管理系统 前言 环境 开发环境 部署环境 功能展示 登录与注册 学生 学生首页 学生查看作业列表 学生提交作业 学生
  • Puppeteer基础入门、常见应用、利用谷歌插件编写Puppeteer脚本

    前言 Puppeteer已经听说过很多次了 也见过一些与之相关的文章 但是一直没怎么研究过 现在来简单学习一下 简介 Puppeteer 是一个 Node 库 它提供了一个高级 API 来通过 DevTools 协议控制 Chromium
  • 前端学习——html

    1 页面标签包含在里 其中有头和躯干 一 head里的常用标签设置 meta标签的设置 在网页中 meta标签最常用的设置是用来设置字符集
  • 静态和动态类型编程语言的区别

    静态和动态是针对变量的数据类型而言的 区别如下 1 使用静态类型语言编写的代码中 要声明变量的数据类型 而且不同数据类型的变量不允许直接赋值 它的数据类型是编译期间进行检查的 2 静态类型语言在使用变量之前 需要为它们分配好内存 3 静态类
  • python画折线图两种写法

    import matplotlib pyplot as plt from openpyxl import load workbook 这个是从Excel表格中导入数据 为了让中文不显示成乱码 plt rcParams font sans s
  • java中锁的面试题

    1 synchronized锁 悲观锁 同步锁 synchronized关键字 表示 同步 的 它可以对 多行代码 进行 同步 将多行代码当成是一个完整的整体 一个线程如果进入到这个代码块中 会全部执行完毕 执行结束后 其它线程才会执行 这
  • Linux学习整理-网络命令集

    目录 前提 1 机器IP地址查询 1 1 ifconfig 1 1 1 安装包 1 1 2 执行命令 1 1 3 拓展 ifconfig的其它用法 1 1 4 常用的属性说明 1 2 ip addr 1 2 1 查看IP地址 1 2 2 其
  • 【实战】区块链技术如何应用于金融领域?

    信任是金融业的基础 为维护信任 金融业的发展催生了大量的中介机构 包括托管机构 第三方支付平台 公证人 银行等 然而 中介机构处理信息依赖人工 且交易信息往往需要经过多道中介的传递 这使得信息出错率高 且效率低下 同时 人们也通常认为权威机
  • Python进阶系列:(八)python反射

    文章目录 前言 一 反射 总结 前言 Python系列文章主要是记录自己学习成果及知识输出整合 提供一个温故而知新的场所 一 反射 1 什么是反射 把字符串映射到实例的变量或实例的方法 只通过字符串调用类中的变量或方法 反射的本质 核心 利
  • 20230830—图形设计

    include app h include
  • C++(函数重载和函数模板)

    重载和模板 一 函数重载 1 函数重载定义 2 判断函数重载的规则 2 名字粉碎 名字修饰 3 C 编译时函数名修饰约定规则 4 C 函数是重载 二 函数模板 一 函数重载 1 函数重载定义 在C 中可以为两个或两个以上的函数提供相同的函数

随机推荐

  • 十三、断路器-Hystrix 的隔离策略

    版权声明 本文为博主原创文章 未经博主允许不得转载 https blog csdn net dengqiang123456 article details 75935122 说明 1 Hystrix 通过舱壁模式来隔离限制依赖的并发量和阻塞
  • 探索创意之旅:打造个人网页的精彩奇遇

    在茫茫的网络世界里 我找到了一个属于自己的小天地 那里不仅有我独特的创意 还有我内心深处的声音 我的个人网页是一段关于探索创意之旅的故事 让我带你一窥我在这个奇妙旅程中的所见所闻 声明 这个网页是使用React18 x写的 由于我平常都是使
  • MATLAB 画常见二次曲面汇总

    一 螺旋线 1 静态螺旋线 a 0 0 1 20 pi h plot3 a cos a a sin a 2 a b linewidth 2 axis 50 50 50 50 0 150 grid on set h erasemode non
  • netbeans的UI代码重新打开可视化视图

    netbeans重新打开可视化视图 视图 gt 编辑器 gt 设计
  • AJAX同步和异步

    1 AJAX 简介 1 1同步和异步 一 同步与异步 1 同步 顺序执行 优点 静态预判结果可控 缺点 耗时任务阻塞执行 2 异步 乱序执行 优点 不会阻塞代码 体验好 缺点 顺序不可控 以银行排队办业务为例 1 同步 默认排队叫号 依次办
  • [LeetCode] 01矩阵中最大矩形 Maximal Rectangle

    相关问题1 LeetCode Find max subsquare whose border values are all 1 相关问题2 LeetCode 01矩阵中最大正方形 Maximal Square Given a 2D bina
  • 微信小程序自定义键盘

    效果图 功能 如果输入 直接补0 如果是09 直接是9 如果是000那就有一个0 不能大于6位 小数点不能大于两位仅能出现一次 还有不输入是禁止支付的 不能小于0 01 失去焦点隐藏面板 光标问题有点小bug 望大佬指点 完整代码 wxml
  • react antd 实现 表格(Table)多个多选功能组件实现

    壹 功能展示和使用需求 需求描述 基于antd 实现 表格要实现多个多选互不影响包含 全选 半选 可自由拓展 功能展示 贰 封装代码 import Checkbox Table from antd import React useEffec
  • 数据挖掘中的机器学习

    1 机器学习的核心目标 从经验数据中推导出规律 学习 机器从经验数据中推导并找出规律的过程 预测 将规律应用于新数据的过程 模型 其中的规律 2 机器学习处理的问题分为监督学习和无监督学习 监督学习又可分为分类 离散 与回归 连续 3 人学
  • 空间配置器(allocator)详解-stl源码剖析学习笔记

    一 什么是空间配置器 空间配置器也就是配置空间 配置容器所需要的空间 该空间获取可以是内存 也可以是磁盘或其他存储介质 二 STL规范必要接口 stl有很多实现版本 根据stl规范 allocator的必要接口如下 类型型别 设计缘由后续章
  • 华为——查分系统

    package OJ import java util public class Bully 老师想知道从某某同学当中 分数最高的是多少 现在请你编程模拟老师的询问 当然 老师有时候需要更新某 位同学的成绩 输入描述 输入包括多组测试数据
  • Cadence 简易使用教程

    原理图的快捷键 快捷键 功能 快捷键 功能 快捷键 功能 i 添加元件 l 添加线名 x 保存并检查 c 复制 w 添加连线 S shift s 保存 m 移动 W shift w 添加粗线 u 取消上一步 M shift m 移动 断线
  • JavaScript学习笔记(11) map、reduce

    map map 方法定义在JavaScript的Array中 调用Array的map 方法 传入我们自己的函数 就可以得到结果 来一个例子 use strict function pow x return x x var arr 1 2 3
  • 已解决pip升级失败报错WARNING: There was an error checking the latest version of pip.

    已解决pip升级失败报错WARNING There was an error checking the latest version of pip 文章目录 报错问题 报错翻译 报错原因 解决方法 千人全栈VIP答疑群联系博主帮忙解决报错
  • 什么是DDoS高防?

    未接入DDoS高防 未接入高防时 源站直接对互联网暴露 一旦发生DDoS攻击 很容易导致源站瘫痪 接入DDoS高防 当您购买DDoS高防并将业务接入DDoS高防后 网站类业务把域名解析指向高防IP 非网站类的业务IP将替换成高防IP DDo
  • windows下恢复删除的逻辑分区

    以前E盘分出一部分做过linux的分区 现在E盘空间不够用了 想增加空间 就到磁盘管理中 将之前的linux的逻辑分区删除了 删除后竟然发现整个E盘都没了 再回到我的电脑 E盘也找不到了 我E盘的东西难道都就丢了吗 赶快上网查了查 找到了
  • Mac 运行VUE项目中遇到的问题

    新装好的VUE cli和Node js 使用一个不报错的vue项目进行试验 看环境是不是正常的 共出现两个问题 1 在运行npm run serve 时报错 错误如下 code encode 提示没有权限 1 进入相应文件夹 我的是 usr
  • 网络安全技术习题

    第一章 一 单选题 共6题 单选题 美国国家信息基础设施 NII 定义了信息安全的 个目标 A 五 B 四 C 三 D 二 我的答案 A正确答案 A 单选题 某银行为了加强自己的网站的安全性 决定采用一个协议 应该采用 协议 A FTP B
  • Xshell7安装教程

    一 下载 百度网盘 yyds 二 安装并和谐 1 双击 Xshell 7 0 0054 exe 安装 2 安装成功后不要启动 记得先关闭 不然和谐会失败 将文件夹 NetSarang 7 x Patch 里面的 NetSarang 7 x
  • 简单远程控制(仅传递鼠标和键盘消息)的实现

    假设两个同样的应用程序 运行在相同的操作系统上 要实现远程控制 可以使用传递鼠标和键盘的消息给对方 对方收到后解析出鼠标和键盘消息如何执行即可 下面是几处关键程序 一是处理收到消息 下面应该放在套接字接收或者串口接收中 小心下面的右键单击