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

Windows SDK(四)鼠标和键盘消息处理

鼠标基础知识

鼠标一般分为三种状态,三个按钮

三种状态:单击,双击,拖动

三个按钮:左键(LBUTTON),右键(RBUTTON),中键(MBUTTON)

左键具有的消息

WM_LBUTTONDOWM 点击鼠标

WM_LBUTTONUP 抬起鼠标

WM_LBUTTONDBLCLK 双击鼠标,有时窗的不支持

右键具有的消息

WM_RBUTTONDOWM

WM_RBUTTONUP

WM_RBUTTONDBLCLK(双击,有时窗口不支持)

中键具有的消息

WM_MBUTTONDOWM

WM_MBUTTONUP

WM_MBUTTONDBLCLK(双击,有时窗口不支持)

直接通过messsage进行分发的消息一般是WM开头,也叫顶层消息,如上消息都是顶层消息

lParam,32位大小,低16位存储x坐标,高16位存储y坐标,用于存储鼠标目前的坐标信息

wParam,32位大小,用于存储系统键盘或鼠标输入的消息

键盘基础知识

顶级窗口:存在多个窗口时,在最上面的窗口

焦点:鼠标点击窗口后,只有该窗口可以被执行各种操作,如键盘发送的消息只会发送到有焦点的

窗口,鼠标点击处叫做焦点

键盘消息的发送:点击键盘时,系统将对应的硬件扫描码格式化成消息,发送到操作系统的消息队

列中,由操作系统进行消息的初步存储,当应用完成上一次消息的处理后,系统将会从消息队列中

抽取消息分发到应用程序进行翻译处理

我们可以自行操作的键盘消息有四种,可以分为以下两种类型:

非系统按键:

WM_KEYDOWN:按键按下去的消息

WM_KEYUP:按键抬起来的消息

当按键按下去不放时,系统认为有很多个按下去的消息发送给操作系统,但此时抬起来时,只会有

一次抬起来的消息发送给操作系统

GetMessageTime:获取上次消息时间

系统按键:

WM_SYSKEYDOWN

WM_SYSKEYUP

如ALT+TAB:页面切换,ALT+F4:关闭窗口,诸如此类ALT按键+,都属于系统按键

如果使用系统按键,应用程序会跳过安全消息,直接把该消息交给默认处理程序:

DefWindowProc进行转发,由Windows进行默认处理,应用程序不对该消息进行处理

每个按键都有相应的虚拟键码对应,用于表示按键动作

wParam 可以与鼠标或键盘的输入的状态作为参数结合,用于判断是否同时多种行为同时进行,这

些参数如下显示,都是以MK_ 前缀:

MK_LBUTTON : 左键按下

MK_MBUTTON : 中键按下

MK_RBUTTON: 右键按下

MK_SHIFT : Shift键按下

MK_CONTROL : Ctrl键按下

应用如下:在点击鼠标左键时

LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)

{

    switch (message)

    {

    case WM_LBUTTONDOWN 用于接收系统鼠标消息,此处左键按下

    {

       if(wParam & MK_SHIFT) 指在左键点击的前提下,shift键按下

       {

           MessageBox(NULL, L"MK_SHIFT + LBUTTON", L"Msg", MB_OK);

       }

       break;

    }

    case WM_DESTROY:

        PostQuitMessage(0);

        break;

    default:

        return DefWindowProc(hWnd, message, wParam, lParam);

    }

    return 0;

}

获取窗口句柄的两种方式:

方式一,用类名寻找窗口:

HWND hMyHWnd = FindWindow(L"rkvir", NULL);  参数依次 窗口类名 标题名,

返回值是窗口句柄

方式二,用标题名寻找窗口:

HWND hMyHWnd = FindWindow(NULL, L"GrkDemo");

鼠标点击画点

LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)

{

    switch (message)

    {

    case WM_LBUTTONDOWN: 用于接收系统鼠标消息,此处左键按下

    {

        int nPosX = LOWORD(lParam);

       int nPosY = HIWORD(lParam); 获取鼠标点击处的xy坐标

       HWND hMyHWnd = FindWindow(NULL, L"GrkDemo");访问一个外部的窗口

       HDC hDC = GetDC(hMyHWnd); 获取窗口句柄

       HPEN hPen = CreatePen(PS_SOLID, 8, RGB(255, 0, 0)); 创建一个画笔

       SelectObject(hDC, hPen); 选择画笔

       POINT pi = { 0 };画笔位置初始化

       MoveToEx(hDC, nPosX, nPosY, &pi);

       LineTo(hDC, nPosX, nPosY); 原地画一个点

       ReleaseDC(hMyHWnd, hDC); 释放设备上下文

    }

    case WM_DESTROY:

        PostQuitMessage(0);

        break;

    default:

        return DefWindowProc(hWnd, message, wParam, lParam);

    }

    return 0;

}

鼠标点击划线

鼠标点击某处,再移动到其他处,松开鼠标,出现一条线

LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)

{

    switch (message)

    {

    case WM_LBUTTONDOWN: 用于接收系统鼠标消息,此处左键按下

    {

       Pos[0].x = LOWORD(lParam);

       Pos[0].y = HIWORD(lParam); 保存第一个点xy坐标

        break;

    }

case WM_LBUTTONUP: 鼠标抬起时绘制

    {

       Pos[1].x = LOWORD(lParam);

       Pos[1].y = HIWORD(lParam); 保存第二个点

       HWND hMyHWnd = FindWindow(NULL, L"GrkDemo"); 此处是在一起其他的窗口处

       HDC hDC = GetDC(hMyHWnd);

       HPEN hPen = CreatePen(PS_SOLID, 8, RGB(255, 0, 0));

       SelectObject(hDC, hPen);

       POINT pi = { 0 };

       MoveToEx(hDC, Pos[0].x, Pos[0].y, &pi); 画笔移至起始位置

       LineTo(hDC, Pos[1].x, Pos[1].y); 画笔移至结束位置

        break;

    }

    case WM_DESTROY:

        PostQuitMessage(0);

        break;

    default:

        return DefWindowProc(hWnd, message, wParam, lParam);

    }

    return 0;

}

鼠标点击画矩形

鼠标点击某处,再移动到其他点,松开鼠标,出现一个矩形

LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM

lParam)

{

    switch (message)

    {

    case WM_LBUTTONDOWN: 用于接收系统鼠标消息,此处左键按下

    {

       Pos[0].x = LOWORD(lParam);

       Pos[0].y = HIWORD(lParam); 保存第一个点xy坐标

        break;

    }

case WM_LBUTTONUP: 鼠标抬起时绘制

    {

        Pos[1].x = LOWORD(lParam);

       Pos[1].y = HIWORD(lParam); 保存第二个点

       HWND hMyHWnd = FindWindow(NULL, L"GrkDemo");

       HDC hDC = GetDC(hMyHWnd);

       HPEN hPen = CreatePen(PS_SOLID, 8, RGB(255, 0, 0));

       SelectObject(hDC, hPen);

       Rectangle(hDC, Pos[0].x, Pos[0].y, Pos[1].x, Pos[1].y);

        break;

    }

    case WM_DESTROY:

        PostQuitMessage(0);

        break;

    default:

        return DefWindowProc(hWnd, message, wParam, lParam);

    }

    return 0;

}

鼠标点击画圆

鼠标点击某处,再移动到其他点,松开鼠标,出现一个圆

LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM

lParam)

{

    switch (message)

    {

    case WM_LBUTTONDOWN: 用于接收系统鼠标消息,此处左键按下

    {

       Pos[0].x = LOWORD(lParam);

       Pos[0].y = HIWORD(lParam); 保存第一个点xy坐标

        break;

    }

case WM_LBUTTONUP: 鼠标抬起时绘制

    {

        Pos[1].x = LOWORD(lParam);

       Pos[1].y = HIWORD(lParam); 保存第二个点

       HWND hMyHWnd = FindWindow(NULL, L"GrkDemo");

       HDC hDC = GetDC(hMyHWnd);

       HPEN hPen = CreatePen(PS_SOLID, 8, RGB(255, 0, 0));

       SelectObject(hDC, hPen);

       Arc(hDC, Pos[0].x, Pos[0].y, Pos[1].x, Pos[1].y, 350, 350, 350, 350);

       ReleaseDC(hMyHWnd, hDC);

       break;

    }

    case WM_DESTROY:

        PostQuitMessage(0);

        break;

    default:

        return DefWindowProc(hWnd, message, wParam, lParam);

    }

    return 0;

}

鼠标点击移动画圆

LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM

lParam)

{

    switch (message)

    {

    case WM_LBUTTONDOWN: 用于接收系统鼠标消息,此处左键按下

    {

       Pos[0].x = LOWORD(lParam);

       Pos[0].y = HIWORD(lParam); 保存第一个点xy坐标

        break;

    }

case WM_MOUSEMOVE: 鼠标滑动

    {

       if (wParam & WM_LBUTTONDOWN) 滑动的同时按住左键

       {

           int nPosX = LOWORD(lParam);

           int nPosY = HIWORD(lParam);

           HWND hMyHWnd = FindWindow(NULL, L"GrkDemo");

           HDC hDC = GetDC(hMyHWnd);

           HPEN hPen = CreatePen(PS_SOLID, 8, RGB(255, 0, 0));

           SelectObject(hDC, hPen);

           POINT pi = { 0 };

           MoveToEx(hDC, nPosX, nPosY, &pi);

           LineTo(hDC, nPosX, nPosY);

           ReleaseDC(hMyHWnd, hDC);

       }      

       break;

    }

    case WM_DESTROY:

        PostQuitMessage(0);

        break;

    default:

        return DefWindowProc(hWnd, message, wParam, lParam);

    }

    return 0;

}

键盘的应用

LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)

{

    switch (message)

    {

    case WM_KEYDOWN 用于接收系统键盘消息

    {

       switch (wParam) 传入按键信息

       {组合键

       case VK_F1: 按下按键F1

       {       

           SHORT bFlag = (getKeyState(VK_SHIFT) & 0x8000); 判断是否同时按下shift键,此处加上&0x8000,可以屏蔽其他无关状态

           if(bFlag < 0) 如果获取短整数小于0,说明shift键被按到

           {

                MessageBox(NULL, L"F1 + SHIFT", L"Msg", MB_OK); 生成一个窗口

           }

           else

           {

                 ​​​​​​​MessageBox(NULL, L"F1", L"Msg", MB_OK); 生成一个窗口

           }  

           break;

       }

       case VK_F2: 按下F2,如果想要触发按下F1的消息:

       {

           SendMessage(hWnd, WM_KEYDOWN, VK_F1, NULL); 发送消息到某窗口 参数依次 要发

送到的窗口的句柄 发送的消息 两个附加消息,如主消息的内部各种选择,一般写NULL。该函数不

仅可以发送给自己的窗口,也可以是别的窗口,此处是发送给别的窗口。此时窗口按下F2,会触

发按下F1的指令

            SendMessage(hWnd, 0x12138, 9999, NULL); 按下F2,触发0x12138的指令

            break;

       }

       case 'B':

       case 'b': 该方式可以设置按到两种不同按键时,都可以同一种操作

       {

           MessageBox(NULL, L"B/b", L"Msg", MB_OK); 生成一个窗口

           break;

       }

    case 0x12138: 接收一个自定义消息

    {

       switch (wParam)

       {

       case 9999:

       {

           MessageBox(NULL, L"MyMsg", L"Msg", MB_OK);

           break;

       }

       }

       break;

    }

    case WM_DESTROY:

        PostQuitMessage(0);

        break;

    default:

        return DefWindowProc(hWnd, message, wParam, lParam);

    }

    return 0;

}

按钮绘制

LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)

{

    switch (message)

    {

    case WM_PAINT:

        {

            PAINTSTRUCT ps; 创建一个包含窗口信息的结构体

            HDC hdc = BeginPaint(hWnd, &ps);

           HFONT hFont = CreateFont(20, 10, 0, 0, 0, 0, 0, 0, GB2312_CHARSET, 0, 0, 0, 0, L"宋体"); 创建一个字体

           SelectObject(hdc, hFont); 选择应用该字体

           SetBkMode(hdc, TRANSPARENT); 设置背景色

           RECT rect; 获取位置

           SetRect(&rect, 30, 50, 400, 200);设置x30y50位置

           SetTextColor(hdc, RGB(0, 0, 255)); 设置字体颜色

           DrawText(hdc, L"蓝色", -1, &rect, DT_NOCLIP); 输出字体

           SetRect(&rect, 30, 100, 400, 200);

           SetTextColor(hdc, RGB(255, 0, 0));

           DrawText(hdc, L"红色", -1, &rect, DT_NOCLIP);

           HBRUSH hSolidBrushBlue = CreateSolidBrush(RGB(0, 0, 255));创建实心画刷

           SelectObject(hdc, hSolidBrushBlue); 选择画刷

           Rectangle(hdc, 90, 50, 120, 80); 绘制矩形

           HBRUSH hSolidBrushRed = CreateSolidBrush(RGB(255, 0, 0));

           SelectObject(hdc, hSolidBrushRed);

           Rectangle(hdc, 90, 100, 120, 130);

           EndPaint(hWnd, &ps);

           break;

      }

    case WM_DESTROY:

        PostQuitMessage(0);

        break;

    default:

        return DefWindowProc(hWnd, message, wParam, lParam);

    }

    return 0;

}

相关文章:

Windows SDK(四)鼠标和键盘消息处理

鼠标基础知识 鼠标一般分为三种状态&#xff0c;三个按钮 三种状态&#xff1a;单击&#xff0c;双击&#xff0c;拖动 三个按钮&#xff1a;左键&#xff08;LBUTTON&#xff09;&#xff0c;右键&#xff08;RBUTTON&#xff09;&#xff0c;中键&#xff08;MBUTTON&…...

LabVIEW汽车自燃监测预警系统

LabVIEW汽车自燃监测预警系统 随着汽车行业的飞速发展&#xff0c;汽车安全问题日益受到公众的关注。其中&#xff0c;汽车自燃现象因其突发性和破坏性&#xff0c;成为一个不可忽视的安全隐患。为了有效预防和减少自燃事故的发生&#xff0c;提出了LabVIEW的汽车自燃监测预警…...

数据图表方案,企业视频生产数据可视化

在信息爆炸的时代&#xff0c;如何将复杂的数据转化为直观、生动的视觉信息&#xff0c;是企业在数字化转型中面临的挑战。美摄科技凭借其独特的数据图表方案&#xff0c;为企业在数据可视化领域打开了一扇全新的大门。 一、数据图表方案的优势 1、高效便捷&#xff1a;利用数…...

【HarmonyOS应用开发】APP应用的通知(十五)

相关介绍 通知旨在让用户以合适的方式及时获得有用的新消息&#xff0c;帮助用户高效地处理任务。应用可以通过通知接口发送通知消息&#xff0c;用户可以通过通知栏查看通知内容&#xff0c;也可以点击通知来打开应用&#xff0c;通知主要有以下使用场景&#xff1a; 显示接收…...

开启一个服务,将服务器指定的文件读取,传播到网上其他终端

from flask import Flask, render_template_string app Flask(__name__)app.route(/get-data) def get_data():# 读取data.txt文件的内容with open(r./2024/2/4/data.txt, r) as file:data file.read()print(data)# 返回数据的HTML表示return render_template_string(<div…...

nii convert to 2D image【python】

可以自己精简&#xff0c;我的label是二分类 import SimpleITK as sitk import cv2 from PIL import Image import numpy as np import nibabel as nib # nii格式一般都会用到这个包 import imageio # 转换成图像 import osimport numpy as np from scipy.ndimage import ro…...

C语言指针学习 之 指针是什么

前言 指针是C语言中一个重要概念&#xff0c;也是C语言的一个重要特色&#xff0c;正确而灵活地运用指针可以使程序简洁、紧凑、高效。每一个学习和使用C语言的人都应当深入的学习和掌握指针&#xff0c;也可以说不掌握指针就没有掌握C语言的精华。 一、什么是指针 想弄清楚什…...

【文本到上下文 #10】探索地平线:GPT 和 NLP 中大型语言模型的未来

一、说明 欢迎阅读我们【文本到上下文 #10】&#xff1a;此为最后一章。以我们之前对 BERT 和迁移学习的讨论为基础&#xff0c;将重点转移到更广阔的视角&#xff0c;包括语言模型的演变和未来&#xff0c;特别是生成式预训练转换器 &#xff08;GPT&#xff09; 及其在 NLP 中…...

(四)elasticsearch 源码之索引流程分析

https://www.cnblogs.com/darcy-yuan/p/17024341.html 1.概览 前面我们讨论了es是如何启动&#xff0c;本文研究下es是如何索引文档的。 下面是启动流程图&#xff0c;我们按照流程图的顺序依次描述。 其中主要类的关系如下: 2. 索引流程 (primary) 我们用postman发送请求&…...

飞天使-k8s知识点16-kubernetes实操1-pod

文章目录 深入Pod 创建Pod&#xff1a;配置文件详解写个pod的yaml 文件深入Pod 探针&#xff1a;探针技术详解 深入Pod 创建Pod&#xff1a;配置文件详解 资源清单参考链接&#xff1a;https://juejin.cn/post/6844904078909128712写个pod的yaml 文件 apiVersion: v1 kind: P…...

【gcc】webrtc发送侧 基于丢包更新码率

参考大神的分析1 rtt 有问题:网络拥堵,直接下调码率 G:\CDN\rtcCli\m98\src\modules\congestion_controller\goog_cc\send_side_bandwidth_estimation.hRttBasedBackoff RttBasedBackoff rtt_backoff_;class RttBasedBackoff {public:explicit RttBasedBackoff(const WebRtcK…...

数字经济的未来:探索Web3的商业模式

随着技术的不断演进&#xff0c;Web3正逐渐成为数字经济发展的关键驱动力之一。在这个数字时代&#xff0c;我们目睹着Web3为商业模式带来翻天覆地的变革&#xff0c;探索着数字经济未来的可能性。 1. 去中心化的商业生态 Web3以去中心化为核心理念&#xff0c;打破了传统商业…...

Centos7部署MetaBase-v0.48.3

MetaBase_v0.48.3下载地址 : http://downloads.metabase.com/v0.48.3/metabase.jar JDK11 下载地址&#xff1a;https://repo.huaweicloud.com/java/jdk/11.0.113/jdk-11.0.1_linux-x64_bin.tar.gz 1.不修改源数据库的方式 官方提示此方式仅用于测试学习使用&#xff0c;如用生…...

【计算机网络】Socket的SO_TIMEOUT与连接超时时间

SO_TIMEOUT选项是Socket的一个选项&#xff0c;用于设置读取数据的超时时间。它指定了在读取数据时等待的最长时间&#xff0c;如果在指定的时间内没有数据可读取&#xff0c;将抛出SocketTimeoutException异常。 SO_TIMEOUT的设置 默认情况下&#xff0c;SO_TIMEOUT选项的值…...

解密 ARMS 持续剖析:如何用一个全新视角洞察应用的性能瓶颈?

作者&#xff1a;饶子昊、杨龙 应用复杂度提升&#xff0c;根因定位困难重重 随着软件技术发展迭代&#xff0c;很多企业软件系统也逐步从单体应用向云原生微服务架构演进&#xff0c;一方面让应用实现高并发、易扩展、开发敏捷度高等效果&#xff0c;但另外一方面也让软件应…...

【OJ比赛日历】春节快乐 #02.10-02.16 #9场

CompHub[1] 实时聚合多平台的数据类(Kaggle、天池…)和OJ类(Leetcode、牛客…&#xff09;比赛。本账号会推送最新的比赛消息&#xff0c;欢迎关注&#xff01; 以下信息仅供参考&#xff0c;以比赛官网为准 目录 2024-02-10&#xff08;周六&#xff09; #4场比赛2024-02-11…...

前端下载文件有哪些方式

前端下载文件有哪些方式 在前端&#xff0c;最常见和最常用的文件下载方式是&#xff1a; 使用 标签的 download 属性&#xff1a; 创建一个 标签&#xff0c;并设置其 href 属性为文件的 URL&#xff0c;然后使用 download 属性指定下载的文件名。 这种方式简单直接&…...

vscode预览github上的markdown效果

需要安装的插件有&#xff1a; Github Markdown Preview Markdown Checkboxes Markdown Emoji Markdown footnotes Markdown Preview Github Styling Markdown Preview Mermaid Support Markdown yaml Preamble ctrlshiftv结合双页功能...

使用PaddleNLP识别垃圾邮件:用BERT做中文邮件内容分类,验证集准确率高达99.6%以上(附公开数据集)

使用PaddleNLP识别垃圾邮件:用BERT做中文邮件内容分类,验证集准确率高达99.6%以上(附公开数据集)。 要使用PaddleNLP和BERT来识别垃圾邮件并做中文邮件内容分类,可以按照以下步骤进行操作: 安装PaddlePaddle和PaddleNLP:首先,确保在你的环境中已经安装了PaddlePaddle和…...

在bash或脚本中,如何并行执行命令或任务(命令行、parallel、make)

最近要批量解压归档文件和压缩包&#xff0c;所以就想能不能并行执行这些工作。因为tar自身不支持并行解压&#xff0c;但是像make却可以支持生成一些文件&#xff0c;所以我才有了这种想法。 方法有两种&#xff0c;第一种不用安装任何软件或工具&#xff0c;直接bash或其他 …...

进程地址空间(比特课总结)

一、进程地址空间 1. 环境变量 1 &#xff09;⽤户级环境变量与系统级环境变量 全局属性&#xff1a;环境变量具有全局属性&#xff0c;会被⼦进程继承。例如当bash启动⼦进程时&#xff0c;环 境变量会⾃动传递给⼦进程。 本地变量限制&#xff1a;本地变量只在当前进程(ba…...

家政维修平台实战20:权限设计

目录 1 获取工人信息2 搭建工人入口3 权限判断总结 目前我们已经搭建好了基础的用户体系&#xff0c;主要是分成几个表&#xff0c;用户表我们是记录用户的基础信息&#xff0c;包括手机、昵称、头像。而工人和员工各有各的表。那么就有一个问题&#xff0c;不同的角色&#xf…...

postgresql|数据库|只读用户的创建和删除(备忘)

CREATE USER read_only WITH PASSWORD 密码 -- 连接到xxx数据库 \c xxx -- 授予对xxx数据库的只读权限 GRANT CONNECT ON DATABASE xxx TO read_only; GRANT USAGE ON SCHEMA public TO read_only; GRANT SELECT ON ALL TABLES IN SCHEMA public TO read_only; GRANT EXECUTE O…...

(二)原型模式

原型的功能是将一个已经存在的对象作为源目标,其余对象都是通过这个源目标创建。发挥复制的作用就是原型模式的核心思想。 一、源型模式的定义 原型模式是指第二次创建对象可以通过复制已经存在的原型对象来实现,忽略对象创建过程中的其它细节。 📌 核心特点: 避免重复初…...

2021-03-15 iview一些问题

1.iview 在使用tree组件时&#xff0c;发现没有set类的方法&#xff0c;只有get&#xff0c;那么要改变tree值&#xff0c;只能遍历treeData&#xff0c;递归修改treeData的checked&#xff0c;发现无法更改&#xff0c;原因在于check模式下&#xff0c;子元素的勾选状态跟父节…...

Linux-07 ubuntu 的 chrome 启动不了

文章目录 问题原因解决步骤一、卸载旧版chrome二、重新安装chorme三、启动不了&#xff0c;报错如下四、启动不了&#xff0c;解决如下 总结 问题原因 在应用中可以看到chrome&#xff0c;但是打不开(说明&#xff1a;原来的ubuntu系统出问题了&#xff0c;这个是备用的硬盘&a…...

C++八股 —— 单例模式

文章目录 1. 基本概念2. 设计要点3. 实现方式4. 详解懒汉模式 1. 基本概念 线程安全&#xff08;Thread Safety&#xff09; 线程安全是指在多线程环境下&#xff0c;某个函数、类或代码片段能够被多个线程同时调用时&#xff0c;仍能保证数据的一致性和逻辑的正确性&#xf…...

CMake控制VS2022项目文件分组

我们可以通过 CMake 控制源文件的组织结构,使它们在 VS 解决方案资源管理器中以“组”(Filter)的形式进行分类展示。 🎯 目标 通过 CMake 脚本将 .cpp、.h 等源文件分组显示在 Visual Studio 2022 的解决方案资源管理器中。 ✅ 支持的方法汇总(共4种) 方法描述是否推荐…...

push [特殊字符] present

push &#x1f19a; present 前言present和dismiss特点代码演示 push和pop特点代码演示 前言 在 iOS 开发中&#xff0c;push 和 present 是两种不同的视图控制器切换方式&#xff0c;它们有着显著的区别。 present和dismiss 特点 在当前控制器上方新建视图层级需要手动调用…...

Selenium常用函数介绍

目录 一&#xff0c;元素定位 1.1 cssSeector 1.2 xpath 二&#xff0c;操作测试对象 三&#xff0c;窗口 3.1 案例 3.2 窗口切换 3.3 窗口大小 3.4 屏幕截图 3.5 关闭窗口 四&#xff0c;弹窗 五&#xff0c;等待 六&#xff0c;导航 七&#xff0c;文件上传 …...