当前位置: 首页 > news >正文

C++ 实现游戏(例如MC)键位显示

效果:
Test in Minecraft 1.20.1
是不是有那味儿了?

  • 显示AWSD,空格,Shift和左右键的按键情况以及左右键的CPS。 彩虹色轮廓,黑白填充。
  • 具有任务栏图标,可以随时关闭
  • 字体是Minecraft AE Pixel,如果你没有装(大概率),你可以换用其他好看的字体(在代码中修改即可)

由于是从一个更大的项目中提取的代码,所以可能会有一些不美观之处。
必要的gcc编译参数:-lgdi32
代码如下:

/****************************************           Keystrokes.cpp            **            游戏按键显示             **         Author: Wormwaker           **       StartDate: 2024/1/14          ****************************************/
#include <Windows.h>
#include <tlhelp32.h>
#include <iostream>
#include <sstream>
#include <string>
#include <cmath>
#include <cstdarg>
using namespace std;
#define KEY_DOWN(vk) (GetAsyncKeyState(vk)&0x8000?1:0)int scr_w = 0, scr_h = 0, taskbar_h = 0;
HDC hdcOrigin = NULL, hdcBuffer = NULL;
HWND hwnd = NULL;
HWND hwnd_console = NULL;HINSTANCE _hInstance = NULL;
HINSTANCE _hPrevInstance = NULL;
LPSTR _lpCmdLine = NULL;
int _nShowCmd = SW_SHOWNORMAL;/
#define CJZAPI __stdcall
template <typename _T>
string CJZAPI str(const _T& value)
{stringstream ss;ss << value;string res;ss >> res;return res;
}
string CJZAPI sprintf2(const char* szFormat, ...)
{va_list _list;va_start(_list, szFormat);char szBuffer[1024] = "\0";_vsnprintf(szBuffer, 1024, szFormat, _list);va_end(_list);return string{szBuffer};
}
bool CJZAPI ExistProcess(DWORD dwPid)	//判断是否存在指定进程
{HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);	if (INVALID_HANDLE_VALUE == hSnapshot) 	{		return false;	}	PROCESSENTRY32 pe = { sizeof(pe) };	BOOL fOk;	for (fOk = Process32First(hSnapshot, &pe); fOk; fOk = Process32Next(hSnapshot, &pe)) 	{		if (pe.th32ProcessID == dwPid) 		{			CloseHandle(hSnapshot);			return true;		}	}	return false;
}
bool CJZAPI ExistProcess(LPCSTR lpName)	//判断是否存在指定进程
{	//******警告!区分大小写!!!!******// //*****警告!必须加扩展名!!!!*****// HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);	if (INVALID_HANDLE_VALUE == hSnapshot) 	{		return false;	}	PROCESSENTRY32 pe = { sizeof(pe) };	BOOL fOk;	for (fOk = Process32First(hSnapshot, &pe); fOk; fOk = Process32Next(hSnapshot, &pe)) 	{		if (! stricmp(pe.szExeFile, lpName)) 		{			CloseHandle(hSnapshot);			return true;		}	}	return false;
}
inline int GetScreenHeight(void) //获取屏幕高度
{return GetSystemMetrics(SM_CYSCREEN);
}
inline int GetScreenWidth(void) //获取屏幕宽度
{return GetSystemMetrics(SM_CXSCREEN);
}
RECT CJZAPI GetSystemWorkAreaRect(void) //获取工作区矩形 
{RECT rt;SystemParametersInfo(SPI_GETWORKAREA,0,&rt,0);    // 获得工作区大小return rt;
}
LONG CJZAPI GetTaskbarHeight(void) 		//获取任务栏高度 
{	INT cyScreen = GetScreenHeight();RECT rt = GetSystemWorkAreaRect();return (cyScreen - (rt.bottom - rt.top));
}
inline HWND GetTaskbarWindow(void)
{return WindowFromPoint(POINT{ GetScreenWidth() / 2,GetScreenHeight() - 2 });
}
inline HFONT CJZAPI CreateFont(int height, int width, LPCSTR lpFamilyName)
{return CreateFont(height,width,0,0,FW_NORMAL,0,0,0,0,0,0,0,0,lpFamilyName);
}
// 辅助函数:HSV到RGB颜色转换
COLORREF HSVtoRGB(double h, double s, double v) {int hi = static_cast<int>(floor(h / 60.0)) % 6;double f = h / 60.0 - floor(h / 60.0);double p = v * (1.0 - s);double q = v * (1.0 - f * s);double t = v * (1.0 - (1.0 - f) * s);switch (hi) {case 0: return RGB(static_cast<int>(v * 255), static_cast<int>(t * 255), static_cast<int>(p * 255));case 1: return RGB(static_cast<int>(q * 255), static_cast<int>(v * 255), static_cast<int>(p * 255));case 2: return RGB(static_cast<int>(p * 255), static_cast<int>(v * 255), static_cast<int>(t * 255));case 3: return RGB(static_cast<int>(p * 255), static_cast<int>(q * 255), static_cast<int>(v * 255));case 4: return RGB(static_cast<int>(t * 255), static_cast<int>(p * 255), static_cast<int>(v * 255));case 5: return RGB(static_cast<int>(v * 255), static_cast<int>(p * 255), static_cast<int>(q * 255));default: return RGB(0, 0, 0);  // Shouldn't reach here}
}
// 主函数:返回随时间变化的彩虹色
COLORREF RainbowColor() {// 假设时间按秒计算,这里使用系统时间或其他适当的时间源double timeInSeconds = GetTickCount() / 1000.0;// 色相按时间变化double hue = fmod(timeInSeconds * 30.0, 360.0);  // 假设每秒变化30度// 饱和度和亮度保持不变double saturation = 1.0;double value = 1.0;// 将HSV颜色转换为RGB并返回return HSVtoRGB(hue, saturation, value);
}inline void CJZAPI SetTextColor(COLORREF color)
{SetTextColor(hdcBuffer, color);
}
inline void CJZAPI TextOut(int x, int y, LPCSTR lpText, HDC hdc = hdcBuffer)
{TextOut(hdc, x, y, lpText, strlen(lpText));
}
inline void CJZAPI TextOutShadow(int x, int y, LPCSTR lpText, HDC hdc = hdcBuffer)
{COLORREF oclr = GetTextColor(hdc);SetTextColor(RGB(0,0,0));TextOut(x+2,y+2,lpText,hdc);SetTextColor(oclr);TextOut(x,y,lpText,hdc);
}
void ClearDevice(HDC _hdc = hdcBuffer, HWND _hwnd = hwnd)
{// 清屏:使用透明色填充整个客户区域RECT rcClient;GetClientRect(_hwnd, &rcClient);HBRUSH hBrush = CreateSolidBrush(RGB(0, 0, 0));FillRect(_hdc, &rcClient, hBrush);DeleteObject(hBrush);
}
/
int left_cps = 0;
int right_cps = 0;
#define CPS_UPDATE_CD 1000
void UpdateCPS(void)
{static DWORD startTime = GetTickCount();static int leftClicks = 0, rightClicks = 0;static bool leftButtonDown = false, rightButtonDown = false;bool leftButtonPressed = KEY_DOWN(VK_LBUTTON);if (leftButtonPressed && !leftButtonDown) leftClicks++;leftButtonDown = leftButtonPressed;bool rightButtonPressed = KEY_DOWN(VK_RBUTTON);if (rightButtonPressed && !rightButtonDown)rightClicks++;rightButtonDown = rightButtonPressed;DWORD currentTime = GetTickCount();DWORD elapsedTime = currentTime - startTime;if (elapsedTime >= CPS_UPDATE_CD) {left_cps = leftClicks * (1000.0 / CPS_UPDATE_CD);right_cps = rightClicks* (1000.0 / CPS_UPDATE_CD);startTime = currentTime;leftClicks = 0;rightClicks = 0;}
}
inline const int& GetCPS(bool left0_right1)
{return left0_right1 ? right_cps : left_cps;
}
void DrawKeyBox(BYTE key, const char* name, int fs, int left, int top, int right, int bottom)
{static const char* font = "Minecraft AE Pixel";COLORREF color;if(KEY_DOWN(key))color = RGB(200, 200, 200) | (200 << 24);elsecolor = RGB(1, 1, 1) | (80 << 24);HBRUSH hBrush = CreateSolidBrush(color);auto prevObj = SelectObject(hdcBuffer, hBrush);Rectangle(hdcBuffer, left + (KEY_DOWN(key)?2:0), top + (KEY_DOWN(key)?2:0), right + (KEY_DOWN(key)?2:0), bottom + (KEY_DOWN(key)?2:0));SelectObject(hdcBuffer, prevObj);DeleteObject(hBrush);HFONT hFont = CreateFont(fs, 0, font);prevObj = SelectObject(hdcBuffer, hFont);SetTextColor(RainbowColor());SetBkMode(hdcBuffer, TRANSPARENT);string text{name};int x = left + (KEY_DOWN(key)?2:0) + (right - left) / 2.0f - text.length() * fs / 4.0f;int y = top + (KEY_DOWN(key)?2:0) + (bottom - top) / 2.0f - fs / 2.0f;TextOutShadow(x, y, text.c_str());DeleteObject(hFont);SelectObject(hdcBuffer, prevObj);
}
void DrawMouseKeys(int left, int top)
{static const int box_w = 85;static const int box_h = 45;static const int box_gap = 15;static const int fs = 15;static const int small_fs = 10;static const char* font = "Minecraft AE Pixel";COLORREF color;if(KEY_DOWN(VK_LBUTTON))color = RGB(200, 200, 200) | (200 << 24);elsecolor = RGB(1, 1, 1) | (80 << 24);HBRUSH hBrush = CreateSolidBrush(color);auto prevObj = SelectObject(hdcBuffer, hBrush);Rectangle(hdcBuffer, left + (KEY_DOWN(VK_LBUTTON)?2:0), top+ (KEY_DOWN(VK_LBUTTON)?2:0), left + (KEY_DOWN(VK_LBUTTON)?2:0) + box_w, top + box_h+ (KEY_DOWN(VK_LBUTTON)?2:0));SelectObject(hdcBuffer, prevObj);DeleteObject(hBrush);if(KEY_DOWN(VK_RBUTTON))color = RGB(200, 200, 200) | (200 << 24);elsecolor = RGB(1, 1, 1) | (80 << 24);hBrush = CreateSolidBrush(color);prevObj = SelectObject(hdcBuffer, hBrush);Rectangle(hdcBuffer, left + (KEY_DOWN(VK_RBUTTON)?2:0) + box_w + box_gap, top + (KEY_DOWN(VK_RBUTTON)?2:0), left + (KEY_DOWN(VK_RBUTTON)?2:0) + box_w*2 + box_gap, top + box_h+ (KEY_DOWN(VK_RBUTTON)?2:0));SelectObject(hdcBuffer, prevObj);DeleteObject(hBrush);HFONT hFont = CreateFont(small_fs, 0, font);prevObj = SelectObject(hdcBuffer, hFont);SetTextColor(RainbowColor());SetBkMode(hdcBuffer, TRANSPARENT);string text = sprintf2("%d CPS", GetCPS(0));int x = left + (KEY_DOWN(VK_LBUTTON)?2:0) + box_w / 2.0f - text.length() * small_fs / 4.0f - 3;int y = top + (KEY_DOWN(VK_LBUTTON)?2:0) + box_h * 0.75f - small_fs / 2.0f;TextOutShadow(x, y, text.c_str());text = sprintf2("%d CPS", GetCPS(1));x = box_gap + (KEY_DOWN(VK_RBUTTON)?2:0) + box_w + left + box_w / 2.0f - text.length() * small_fs / 4.0f - 3;y = top + (KEY_DOWN(VK_RBUTTON)?2:0) + box_h * 0.75f - small_fs / 2.0f;TextOutShadow(x, y, text.c_str());DeleteObject(hFont);SelectObject(hdcBuffer, prevObj);hFont = CreateFont(fs, 0, font);prevObj = SelectObject(hdcBuffer, hFont);SetTextColor(RainbowColor());SetBkMode(hdcBuffer, TRANSPARENT);text = "LMB";x = left + (KEY_DOWN(VK_LBUTTON)?2:0) + box_w / 2.0f - text.length() * fs / 4.0f - 4;y = top + (KEY_DOWN(VK_LBUTTON)?2:0) + box_h * 0.22f;TextOutShadow(x, y, text.c_str());text = "RMB";x = box_gap + (KEY_DOWN(VK_RBUTTON)?2:0) + box_w + left + box_w / 2.0f - text.length() * fs / 4.0f - 4;y = top + (KEY_DOWN(VK_RBUTTON)?2:0) + box_h * 0.22f;TextOutShadow(x, y, text.c_str());DeleteObject(hFont);SelectObject(hdcBuffer, prevObj);
}
void DrawKeyMouseInfo()
{static const int _left = 15;static const int _top = 40;static const int _pen_size = 2;static const int box_w = 54;static const int box_h = 54;static const int box_gap = 10;static const int fs = 24;COLORREF color = RainbowColor();HPEN hPen;hPen = CreatePen(PS_SOLID, _pen_size, color);SelectObject(hdcBuffer, hPen);DrawKeyBox('A', "A", fs, _left, _top + box_h + box_gap, _left + box_w, _top + box_h + box_gap + box_h);DrawKeyBox('W', "W", fs, _left + box_w + box_gap, _top, _left + box_w*2 + box_gap, _top + box_h);DrawKeyBox('S', "S", fs, _left + box_w + box_gap, _top + box_h + box_gap, _left + box_w*2 + box_gap, _top + box_h + box_gap + box_h);DrawKeyBox('D', "D", fs, _left + box_w * 2 + box_gap * 2, _top + box_h + box_gap, _left + box_w*3 + box_gap * 2, _top + box_h + box_gap + box_h);static const int space_h = 35;DrawKeyBox(' ', "--", fs, _left, _top + box_h*2 + box_gap*2, _left + box_w * 3 + box_gap * 2, _top + box_h*2+box_gap*2+space_h);DrawKeyBox(VK_SHIFT, "Shift", fs * 0.75, _left, _top + box_h*2 + box_gap*3 + space_h, _left + box_w * 3 + box_gap * 2, _top + box_h*2+box_gap*3+space_h*2);DrawMouseKeys(_left, _top + box_h*3 + box_gap*3 + space_h*2);DeleteObject(hPen);
}void DrawUI()
{DrawKeyMouseInfo();
}#define TIMER_PAINT_CD 10L
#define TIMER_UPDATE_CD 5L
VOID CALLBACK TimerProc_Paint(_In_  HWND hwnd,_In_  UINT uMsg,_In_  UINT_PTR idEvent,_In_  DWORD dwTime)
{RECT rect;GetClientRect(hwnd,&rect);InvalidateRect(hwnd, &rect, FALSE);	//会发送WM_PAINT消息
}
VOID CALLBACK TimerProc_Update(_In_  HWND hwnd,_In_  UINT uMsg,_In_  UINT_PTR idEvent,_In_  DWORD dwTime)
{UpdateCPS();
}
PAINTSTRUCT ps;
void BeginDraw()
{hdcOrigin = BeginPaint(hwnd, &ps);SetBkMode(hdcBuffer, TRANSPARENT);
}
void EndDraw()
{EndPaint(hwnd, &ps);
}
LRESULT CALLBACK WndProc(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lParam) 
{static HBITMAP hBitmap = NULL;switch(Message) {case WM_CREATE:{hdcBuffer = CreateCompatibleDC(NULL);SetTimer(hwnd, 0, TIMER_PAINT_CD, TimerProc_Paint);SetTimer(hwnd, 2, TIMER_UPDATE_CD, TimerProc_Update);break;}case WM_DESTROY: {if (hdcBuffer)DeleteDC(hdcBuffer), hdcBuffer = nullptr;if (hBitmap)DeleteObject(hBitmap), hBitmap = nullptr;KillTimer(hwnd, 0);KillTimer(hwnd, 2);PostQuitMessage(0);break;}case WM_PAINT:{BeginDraw();// 获取客户区域的大小RECT rcClient;GetClientRect(hwnd, &rcClient);int clientWidth = rcClient.right - rcClient.left;int clientHeight = rcClient.bottom - rcClient.top;// 创建双缓冲if (hBitmap)DeleteObject(hBitmap);hBitmap = CreateCompatibleBitmap(hdcOrigin, clientWidth, clientHeight);SelectObject(hdcBuffer, hBitmap);ClearDevice();DrawUI();// 将缓冲区的内容一次性绘制到屏幕上BitBlt(hdcOrigin, 0, 0, clientWidth, clientHeight, hdcBuffer, 0, 0, SRCCOPY);EndDraw();break;}default:return DefWindowProc(hwnd, Message, wParam, lParam);}return 0;
}
/
bool TerminalCheck(DWORD dwPid, HWND _hwnd)
{	//检查是否为win11新终端HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);	if (INVALID_HANDLE_VALUE == hSnapshot) 	{		return false;	}	PROCESSENTRY32 pe = { sizeof(pe) };	BOOL fOk;	for (fOk = Process32First(hSnapshot, &pe); fOk; fOk = Process32Next(hSnapshot, &pe)) 	{		if (! stricmp(pe.szExeFile, "WindowsTerminal.exe")&& pe.th32ProcessID == dwPid) 		{			CloseHandle(hSnapshot);			{char title[MAX_PATH];GetWindowText(_hwnd, title, MAX_PATH);if(strcmp(title, _pgmptr) && strcmp(title, "Keystrokes"))return false;return true;}		}	}	return false;
}
BOOL CALLBACK EnumWindowsProc(HWND _hwnd, LPARAM lParam)
{DWORD pid;GetWindowThreadProcessId(_hwnd, &pid);if(TerminalCheck(pid, _hwnd)){hwnd_console = _hwnd;return FALSE;}return TRUE;
}
int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd)
{_hInstance = hInstance;_hPrevInstance = hPrevInstance;_lpCmdLine = lpCmdLine;_nShowCmd = nShowCmd;scr_w = GetScreenWidth();scr_h = GetScreenHeight();taskbar_h = GetTaskbarHeight();WNDCLASS wc = { 0 };wc.lpfnWndProc = WndProc;wc.hInstance = hInstance;wc.lpszClassName = "KeyStrokesWindowClass";if(!RegisterClass(&wc)) {MessageBox(NULL, "Window Registration Failed!","Error!",MB_ICONEXCLAMATION|MB_OK);return 0;}hwnd = CreateWindowEx(WS_EX_LAYERED | WS_EX_TRANSPARENT | WS_EX_TOPMOST, "KeyStrokesWindowClass", "KeyStrokes by Wormwaker", WS_POPUP,0, /* x */0, /* y */scr_w, /* width */scr_h, /* height */NULL,//		NULL,NULL,hInstance,NULL);if(hwnd == NULL) {MessageBox(NULL, "Window Creation Failed!","Error!",MB_ICONEXCLAMATION|MB_OK);return 0;}SetConsoleTitle("Keystrokes");if(ExistProcess("WindowsTerminal.exe")){	//win11电脑且使用新版终端EnumWindows(EnumWindowsProc, 0);}else{	//旧版控制台主机hwnd_console = GetConsoleWindow();}
#ifndef SHOWCONSOLEif(hwnd_console != INVALID_HANDLE_VALUE && hwnd_console != nullptr)ShowWindow(hwnd_console, SW_HIDE);
#endif// 设置窗口透明度SetLayeredWindowAttributes(hwnd, RGB(0, 0, 0), 0, LWA_COLORKEY);ShowWindow(hwnd, SW_SHOWMAXIMIZED);SetWindowPos(hwnd, HWND_TOPMOST, 0, 0, scr_w,scr_h, SWP_NOSIZE);MSG msg;while(GetMessage(&msg, NULL, 0, 0) > 0) { /* If no error is received... */TranslateMessage(&msg); /* Translate key codes to chars if present */DispatchMessage(&msg); /* Send it to WndProc */ShowWindowAsync(hwnd, SW_SHOWMAXIMIZED); //保持显示并最大化}return 0;
}

相关文章:

C++ 实现游戏(例如MC)键位显示

效果&#xff1a; 是不是有那味儿了&#xff1f; 显示AWSD&#xff0c;空格&#xff0c;Shift和左右键的按键情况以及左右键的CPS。 彩虹色轮廓&#xff0c;黑白填充。具有任务栏图标&#xff0c;可以随时关闭字体是Minecraft AE Pixel&#xff0c;如果你没有装&#xff08;大…...

力扣hot100 合并两个有序链表 递归 双指针

Problem: 21. 合并两个有序链表 文章目录 &#x1f496; 递归思路 &#x1f496; 双指针 &#x1f496; 递归 思路 &#x1f468;‍&#x1f3eb; 参考地址 n , m n,m n,m 分别为 list1 和 list2 的元素个数 ⏰ 时间复杂度: O ( n m ) O(nm) O(nm) &#x1f30e; 空间复杂…...

10个常用python自动化脚本

大家好&#xff0c;Python凭借其简单和通用性&#xff0c;能够为解决每天重复同样的工作提供最佳方案。本文将探索10个Python脚本&#xff0c;这些脚本可以帮助自动化完成任务&#xff0c;提高工作效率。无论是开发者、数据分析师还是仅仅想简化工作流程的普通用户&#xff0c;…...

C++中函数的默认参数(缺省参数)

一、函数默认参数的概念 在函数声明时&#xff0c;预先对函数参数进行赋值&#xff0c;该参数即为函数的默认参数&#xff0c;也叫缺省参数。 如下函数func1包含默认参数&#xff0c;若调用函数func1时没有给函数传入实参&#xff0c;则默认实参为10086 void func1(int a 1…...

在线扒站网PHP源码-在线扒站工具网站源码

源码介绍 这是一款在线的网站模板下载程序&#xff0c;也就是我们常说的扒站工具&#xff0c;利用它我们可以很轻松的将别人的网站模板样式下载下来&#xff0c;这样就可以大大提高我们编写前端的速度了&#xff01;注&#xff1a;扒取的任何站点不得用于商业、违法用途&#…...

vue+elementUI el-select 中 没有加clearable出现一个或者多个×清除图标问题

1、现象&#xff1a;下方截图多清除图标了 2、在全局common.scss文件中加一个下方的全局样式noClear 3、在多清除图标的组件上层div加noClear样式 4、清除图标去除成功...

【Python从入门到进阶】47、Scrapy Shell的了解与应用

接上篇《46、58同城Scrapy项目案例介绍》 上一篇我们学习了58同城的Scrapy项目案例&#xff0c;并结合实际再次了项目结构以及代码逻辑的用法。本篇我们来学习Scrapy的一个终端命令行工具Scrapy Shell&#xff0c;并了解它是如何帮助我们更好的调试爬虫程序的。 一、Scrapy Sh…...

【ARM 嵌入式 编译系列 2.2 -- GCC 编译参数学习 assembler-with-cpp 使用介绍】

请阅读【嵌入式开发学习必备专栏 之 ARM GCC 编译专栏】 文章目录 GCC 编译选项 assembler-with-cpp GCC 编译选项 assembler-with-cpp 在 rt-thread 的编译脚本中经常会看到下面编译参数&#xff1a; AFLAGS -c DEVICE -x assembler-with-cpp -Wa,-mimplicit-itthumb a…...

深入理解java对象的内存布局

概述&#xff1a; 在HotSpot虚拟机里&#xff0c;对象在堆内存中的存储布局可以划分为三个部分&#xff1a;对象头&#xff08;Header&#xff09;、实例数据&#xff08;Instance Data&#xff09;和对齐填充&#xff08;Padding&#xff09;。 在HotSpot虚拟机里&#xff0c;…...

MetaGPT中提到的SOP

MetaGPT框架中的提及的SOP概念指的是什么&#xff0c;有什么优点和缺点&#xff0c;为什么要使用SOP? 在MetaGPT框架中&#xff0c;SOP&#xff08;Set of Procedures&#xff09;指的是一套标准化的流程和步骤&#xff0c;用于指导模型完成特定任务。SOP可以帮助模型更好地理…...

第15届蓝桥杯嵌入式省赛准备第三天总结笔记(使用STM32cubeMX创建hal库工程+串口接收发送)

因为我是自己搞得板子&#xff0c;原本的下程序和串口1有问题&#xff0c;所以我用的是串口2&#xff0c;用的PA2和PA3 一&#xff0c;使用CubeMX配置串口 选择A开头的这个是异步通信。 配置串口参数&#xff0c;往届的题基本用的9600波特率&#xff0c;所以我这里设置为9600…...

centos安装redis,但是启动redis-server /home/redis/conf/redis7000.conf卡住,怎么解决

如果你在启动 Redis 服务器时发现过程卡住&#xff0c;这可能是由于几种不同的原因。下面是一些可能导致这种情况的原因以及相应的解决方法&#xff1a; 1. 后台启动 Redis 默认在前台运行。如果你在命令行启动 Redis 并且没有指定它在后台运行&#xff0c;它将在前台运行&am…...

开发实践6_project

要求&#xff1a; ① 页面写入超链接&#xff0c;获取所有数据item&#xff0c;显示在另一个页面&#xff0c;1min内&#xff0c;即使数据有变化&#xff0c;页面内容不变&#xff0c;1min后点击超链接可获取最新信息&#xff1b; ② 使用middleware完成用户请求路径判断 &am…...

HCIP----MGRE实验

实验要求&#xff1a; 第一步&#xff0c;基本的IP地址配置 R1&#xff1a; [R1]int g0/0/1 [R1-GigabitEthernet0/0/1]ip add 192.168.1.1 24 #配置PC的网关 [R1]int Serial 4/0/0 [R1-Serial4/0/0]link-protocol hdlc #R1和R2之间采用hdlc封装 [R1-S…...

STM32标准库开发——PWM驱动代码

PWM驱动初始化代码 使能定时器二时钟 RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);设置定时器时钟源 TIM_InternalClockConfig(TIM2);配置定时器二的时基单元 TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct; TIM_TimeBaseInitStruct.TIM_ClockDivisionTIM_CKD_D…...

postman导入https证书

进入setting配置中Certificates配置项 点击“Add Certificate”,然后配置相关信息 以上配置完毕&#xff0c;如果测试出现“SSL Error:Self signed certificate” 则将“SSL certificate verification”取消勾选...

Spark UI中 Shuffle Exchange 和 BroadcastExchange 中的 dataSize 值为什么不一样

背景 Spark 3.5 最近在看Spark UI 上的一些指标看到一个很有意思的东西, 相邻的Shuffle Exechange 和 BroadcastExechange 中的 datasize 居然不一样&#xff0c; 前者为 765KB, 后者为 64.5MB。差别还不少&#xff0c;中间就增加了一个 AQEShuffleRead 计划 结论 Shuffle E…...

阿里云优惠券领取入口、使用方法和限制条件,2024最新

阿里云优惠代金券领取入口&#xff0c;阿里云服务器优惠代金券、域名代金券&#xff0c;在领券中心可以领取当前最新可用的满减代金券&#xff0c;阿里云百科aliyunbaike.com分享阿里云服务器代金券、领券中心、域名代金券领取、代金券查询及使用方法&#xff1a; 阿里云优惠券…...

自己构建webpack+vue3+ts

先看看我的目录结构&#xff08;我全局使用TS&#xff09;&#xff1a; 一、安装配置webpack打包 安装esno npm install esnoesno 是基于 esbuild 的 TS/ESNext node 运行时,有了它&#xff0c;就可以直接通过esno *.ts的方式启动脚本&#xff0c;package.json中添加 type:…...

【AI】小白入门笔记

前言 2024年&#xff0c;愿新年胜旧年&#xff01;作为AI世界的小白&#xff0c;今天先来从一些概念讲起&#xff0c;希望路过的朋友们多多指教&#xff01; 正文 AI (人工智能) 提起AI, 大家可能会想起各种机器人&#xff0c;移动手机的“Siri”,"小爱同学", 是语…...

微软PowerBI考试 PL300-选择 Power BI 模型框架【附练习数据】

微软PowerBI考试 PL300-选择 Power BI 模型框架 20 多年来&#xff0c;Microsoft 持续对企业商业智能 (BI) 进行大量投资。 Azure Analysis Services (AAS) 和 SQL Server Analysis Services (SSAS) 基于无数企业使用的成熟的 BI 数据建模技术。 同样的技术也是 Power BI 数据…...

QMC5883L的驱动

简介 本篇文章的代码已经上传到了github上面&#xff0c;开源代码 作为一个电子罗盘模块&#xff0c;我们可以通过I2C从中获取偏航角yaw&#xff0c;相对于六轴陀螺仪的yaw&#xff0c;qmc5883l几乎不会零飘并且成本较低。 参考资料 QMC5883L磁场传感器驱动 QMC5883L磁力计…...

从深圳崛起的“机器之眼”:赴港乐动机器人的万亿赛道赶考路

进入2025年以来&#xff0c;尽管围绕人形机器人、具身智能等机器人赛道的质疑声不断&#xff0c;但全球市场热度依然高涨&#xff0c;入局者持续增加。 以国内市场为例&#xff0c;天眼查专业版数据显示&#xff0c;截至5月底&#xff0c;我国现存在业、存续状态的机器人相关企…...

高危文件识别的常用算法:原理、应用与企业场景

高危文件识别的常用算法&#xff1a;原理、应用与企业场景 高危文件识别旨在检测可能导致安全威胁的文件&#xff0c;如包含恶意代码、敏感数据或欺诈内容的文档&#xff0c;在企业协同办公环境中&#xff08;如Teams、Google Workspace&#xff09;尤为重要。结合大模型技术&…...

【Zephyr 系列 10】实战项目:打造一个蓝牙传感器终端 + 网关系统(完整架构与全栈实现)

🧠关键词:Zephyr、BLE、终端、网关、广播、连接、传感器、数据采集、低功耗、系统集成 📌目标读者:希望基于 Zephyr 构建 BLE 系统架构、实现终端与网关协作、具备产品交付能力的开发者 📊篇幅字数:约 5200 字 ✨ 项目总览 在物联网实际项目中,**“终端 + 网关”**是…...

大学生职业发展与就业创业指导教学评价

这里是引用 作为软工2203/2204班的学生&#xff0c;我们非常感谢您在《大学生职业发展与就业创业指导》课程中的悉心教导。这门课程对我们即将面临实习和就业的工科学生来说至关重要&#xff0c;而您认真负责的教学态度&#xff0c;让课程的每一部分都充满了实用价值。 尤其让我…...

全志A40i android7.1 调试信息打印串口由uart0改为uart3

一&#xff0c;概述 1. 目的 将调试信息打印串口由uart0改为uart3。 2. 版本信息 Uboot版本&#xff1a;2014.07&#xff1b; Kernel版本&#xff1a;Linux-3.10&#xff1b; 二&#xff0c;Uboot 1. sys_config.fex改动 使能uart3(TX:PH00 RX:PH01)&#xff0c;并让boo…...

Aspose.PDF 限制绕过方案:Java 字节码技术实战分享(仅供学习)

Aspose.PDF 限制绕过方案&#xff1a;Java 字节码技术实战分享&#xff08;仅供学习&#xff09; 一、Aspose.PDF 简介二、说明&#xff08;⚠️仅供学习与研究使用&#xff09;三、技术流程总览四、准备工作1. 下载 Jar 包2. Maven 项目依赖配置 五、字节码修改实现代码&#…...

基于 TAPD 进行项目管理

起因 自己写了个小工具&#xff0c;仓库用的Github。之前在用markdown进行需求管理&#xff0c;现在随着功能的增加&#xff0c;感觉有点难以管理了&#xff0c;所以用TAPD这个工具进行需求、Bug管理。 操作流程 注册 TAPD&#xff0c;需要提供一个企业名新建一个项目&#…...

LangChain知识库管理后端接口:数据库操作详解—— 构建本地知识库系统的基础《二》

这段 Python 代码是一个完整的 知识库数据库操作模块&#xff0c;用于对本地知识库系统中的知识库进行增删改查&#xff08;CRUD&#xff09;操作。它基于 SQLAlchemy ORM 框架 和一个自定义的装饰器 with_session 实现数据库会话管理。 &#x1f4d8; 一、整体功能概述 该模块…...