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

news2024/12/24 21:29:35

效果:
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);
	else
		color = 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);
	else
		color = 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);
	else
		color = 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 SHOWCONSOLE
	if(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;
}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

网络安全技术新手入门:利用永恒之蓝获取靶机控制权限

目录 前言 一、搜索永恒之蓝可用模块 二、使用攻击模块 三、配置攻击模块 四、攻击 五、总结 前言 相关法律声明&#xff1a;《中华人民共和国网络安全法》第二十七条 任何个人和组织不得从事非法侵入他人网络、干扰他人网络正常功能、窃取网络数据等危害网络安全的活动&…

网络安全技术新手入门:在docker上安装dvwa靶场

前言 准备工作&#xff1a;1.已经安装好kali linux 步骤总览&#xff1a;1.安装好docker 2.拖取镜像&#xff0c;安装dvwa 一、安装docker 输入命令&#xff1a;sudo su 输入命令&#xff1a;curl -fsSL https://download.docker.com/linux/debian/gpg | sudo apt-key …

MATLAB - 机器人关节空间运动模型

系列文章目录 前言 关节空间运动模型描述了在闭环关节空间位置控制下机械手的运动&#xff0c;在关节空间运动模型&#xff08;jointSpaceMotionModel&#xff09;对象和关节空间运动模型块中使用。 机器人机械手是典型的位置控制设备。要进行关节空间控制&#xff0c;需要指…

C# 图解教程 第5版 —— 第24章 预处理指令

文章目录 24.1 什么是预处理指令24.2 基本规则24.3 符号指令&#xff08;#define、#undef &#xff09;24.4 条件编译&#xff08;#if、#else、#elif、#endif&#xff09;24.5 条件编译结构24.6 诊断指令&#xff08;#warning、#error&#xff09;24.7 行号指令&#xff08;#li…

order by之后的injection(sqllabs第四十六关)

order by相关注入知识 这一关的sql语句是利用的order by 根据输入的id不同数据排序不一样可以确定就是order by order by后面无法使用ubion注入&#xff08;靠找不到&#xff09; 可以利用后面的参数进行攻击 1&#xff09;数字 没作用考虑布尔类型 rand和select ***都可以 …

瑞幸黑金鹿王者霸屏尊享权益的技术实现方式探讨

上周六&#xff0c;公司加班举办技术专场招聘活动&#xff0c;在忙碌的下午茶歇时间&#xff0c;我尊敬的伟大的韩百万老师提议带着我去瑞幸装了个 BI&#xff0c;扫码领取咖啡的那一个瞬间&#xff0c;瑞幸店内的电视大屏上赫然显示了&#xff1a;韩百万。回来的路上我虚心请教…

gem5学习(14):将gem5扩展到ARM——Extending gem5 for ARM

目录 一、Downloading ARM Binaries 二、Building gem5 to run ARM Binaries 三、Modifying simple.py to run ARM Binaries 四、Running gem5 五、ARM Full System Simulation An aside on FS simulations 这个是gem5-learning中Getting Started的最后一篇文章&#xff…

OpenCV-24双边滤波

一、概念 双边滤波对于图像的边缘信息能够更好的保存。其原理为一个与空间距离相关的高斯函数与一个灰度距离相关的高斯函数相乘。 空间距离&#xff1a;指的是当前点与中心点的欧式距离。空间域的高斯函数及其数学形式为&#xff1a; 其中&#xff08;xi&#xff0c;yi&…

【Linux】Linux 系统编程——cd 命令

文章目录 1.命令概述2.命令格式3.常用选项4.相关描述5.参考示例 1.命令概述 “cd 命令&#xff0c;即 ‘change directory’ 的缩写&#xff0c;主要用于 Unix、Linux 和 macOS 等操作系统中&#xff0c;用于改变当前工作目录。该命令支持绝对路径和相对路径两种形式。若未指定…

关于运维·关于数据库面试题

目录 一、数据库类型 二、数据库引擎 三、mysql数据库类型 四、mysql的约束添加 五、主从复制原理 六、主从方式有几种 七、mysql主从数据不一致的原因 八、mysql的优化 九、什么是事务的特征 十、数据库读写分离的好处 十一、怎样优化sql语句 十二、mysql的同步方…

强化学习应用(七):基于Q-learning的无人机物流路径规划研究(提供Python代码)

一、Q-learning简介 Q-learning是一种强化学习算法&#xff0c;用于解决基于马尔可夫决策过程&#xff08;MDP&#xff09;的问题。它通过学习一个价值函数来指导智能体在环境中做出决策&#xff0c;以最大化累积奖励。 Q-learning算法的核心思想是通过不断更新一个称为Q值的…

[Linux 进程(三)] 进程优先级,进程间切换,main函数参数,环境变量

文章目录 1、进程优先级1.1 Linux下查看进程优先级1.2 Linux 进程优先级的修改PRI and NItop命令配合操作更改优先级 1.3 竞争 独立 并行 并发 2、进程间切换3、Linux2.6内核进程调度队列3.1 活跃进程3.2 过期进程 4 main函数参数 — 命令行参数4.1 利用main函数的参数实现一个…

Makefile编译原理 make和makefile

一.什么是makefile 如图所示&#xff0c;一个工程中的源文件不计其数&#xff0c;其按类型、功能、模块分别放在若干个目录中&#xff0c; Makefile 文件定义了一系列的规则来指定哪些文件需要先编译&#xff0c;哪些文件需要后编译&#xff0c;哪些文件需要重新编译&#xff…

Android-基础

Activity生命周期 1.启动Activity&#xff1a;系统会先调用onCreate方法&#xff0c;然后调用onStart方法&#xff0c;最后调用onResume&#xff0c;Activity进入运行状态。 2.当前Activity被其他Activity覆盖其上或被锁屏&#xff1a;系统会调用onPause方法&#xff0c;暂停当…

shell 脚本之一键部署安装 Nginx

定义一个变量来存放 nginx 版本号 version1.15.4nginx 下载地址&#xff1a;http://nginx.org/download/ 下列函数功能则是判断当前步骤是否执行成功&#xff0c;并将结果输出出来 function show_result(){if [ "$1" -eq 0 ]thenecho -e "\e[32m$2 is Succes…

YOLOv5独家原创改进:多层次特征融合(SDI)结合PConv、DualConv、GSConv,实现二次创新 | UNet v2最新论文

💡💡💡本文独家改进:多层次特征融合(SDI)高效结合DualConv、PConv、GSConv等实现二次创新 1)替代原始的Concat; 收录 YOLOv5原创自研 https://blog.csdn.net/m0_63774211/category_12511931.html 💡💡💡全网独家首发创新(原创),适合paper !!! 💡�…

“黑科技”四川首秀!“全光塑”个性化近视矫正技术在成都发布

眼睛被称为“心灵的窗口”&#xff0c;是我们最重要的器官之一。而近视却让我们心灵的窗口蒙上一层灰尘&#xff0c;为了摘掉眼镜&#xff0c;重获清晰视力&#xff0c;近视手术可谓是不二之选。数十年来&#xff0c;近视手术飞速发展&#xff0c;如今世界上前沿的近视矫正技术…

大众汽车将集成ChatGPT人工智能技术;OpenAI对新闻组织诉讼的回应

&#x1f989; AI新闻 &#x1f680; 大众汽车将集成ChatGPT人工智能技术&#xff0c;提升车载语音助手功能 摘要&#xff1a;大众汽车宣布其现有的IDA语音助手将引入ChatGPT人工智能技术&#xff0c;并用于多款新车型。通过添加ChatGPT&#xff0c;大众汽车将支持以更直观、…

Javaweb之SpringBootWeb案例新增部门的详细解析

2.3 删除部门 查询部门的功能我们搞定了&#xff0c;下面我们开始完成删除部门的功能开发。 2.3.1 需求 点击部门列表后面操作栏的 "删除" 按钮&#xff0c;就可以删除该部门信息。 此时&#xff0c;前端只需要给服务端传递一个ID参数就可以了。 我们从接口文档中也…

多维时序 | Matlab实现GRO-CNN-BiLSTM-Attention淘金算法优化卷积神经网络-双向长短期记忆网络结合注意力机制多变量时间序列预测

多维时序 | Matlab实现GRO-CNN-BiLSTM-Attention淘金算法优化卷积神经网络-双向长短期记忆网络结合注意力机制多变量时间序列预测 目录 多维时序 | Matlab实现GRO-CNN-BiLSTM-Attention淘金算法优化卷积神经网络-双向长短期记忆网络结合注意力机制多变量时间序列预测效果一览基…