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

《Windows API每日一练》6.1 鼠标基础知识

本节我们讲述鼠标的一些基础知识。

本节必须掌握的知识点:

        鼠标

6.1.1 鼠标

       鼠标是1964年由Douglas Engelbart发明的,用来取代由键盘输入的繁琐指令,简化电脑操作。早期的鼠标是单键鼠标,只有一个键,后来逐步改进为双键鼠标和带滚轮的双键鼠标。

       ■检测鼠标

我们可以使用GetSystemMetrics函数来判断是否连接了鼠标:

fMouse = GetSystemMetrics (SM_MOUSEPRESENT);

当鼠标已被安装时,fMouse的值为TRUE(非零),否则值为0。但是,在Windows98中,不论鼠标是否连接上,该函数的返回值总是TRUE。在Windows NT中,该函数的返回值是正确的。

为了确定所安装鼠标的按钮个数,可以利用以下语句:

cButtons = GetSystemMecrics (SM_CMOUSEBUTTONS);

若没有安装鼠标,该函数的返回值为0。但是,在Windows 98下,该函数在没有安装鼠标时还是返回2。

习惯用左手的用户可以利用Windows控制面板来切换鼠标的按钮。程序也可以通过检 査是否调用了带SM_SWAPBUTTON参数的GetSystemMetrics函数,判断鼠标的按钮是否被切换,但是这种方法通常没有必要。食指控制的按钮被认为是左键,即使该按钮在物理位置上位于鼠标的右侧。但是,在一个计算机培训程序中,如果想在屏幕上画出一个鼠标, 在这种情况下可能需要知道鼠标的按钮是否己被切换。

●在控制面板中,还可以设定鼠标的其他参数,比如鼠标双击的速度。从Windows应用 程序中调用SystemParametersinfo函数可以获取或设定这个参数信息。

SystemParametersInfo用于获取或设置系统参数的信息。它允许你查询和修改各种系统设置,如桌面背景、屏幕分辨率、鼠标速度等。

以下是 SystemParametersInfo 函数的原型:

BOOL SystemParametersInfo(

  UINT  uiAction,        // 操作类型

  UINT  uiParam,       // 相关参数

  PVOID pvParam,      // 相关数据

  UINT  fWinIni          // 更新方式

);

返回值:

如果函数调用成功,返回值为非零值(TRUE)。

如果函数调用失败,返回值为零(FALSE)。

SystemParametersInfo 函数的使用方法取决于所需的操作类型和参数。以下是一些常见的示例用法:

1.获取桌面背景路径:

WCHAR wallpaperPath[MAX_PATH];

SystemParametersInfo(SPI_GETDESKWALLPAPER, MAX_PATH, wallpaperPath, 0);

在这个示例中,SPI_GETDESKWALLPAPER 是操作类型,MAX_PATH 是缓冲区大小,wallpaperPath 是接收桌面背景路径的缓冲区。

2.设置鼠标速度:

int mouseSpeed = 10; // 设置鼠标速度为 10

SystemParametersInfo(SPI_SETMOUSESPEED, 0, (PVOID)mouseSpeed,

SPIF_UPDATEINIFILE);

在这个示例中,SPI_SETMOUSESPEED 是操作类型,(PVOID)mouseSpeed 是要设置的鼠标速度值,SPIF_UPDATEINIFILE 指定更新系统设置。

【注意】具体的操作类型、参数和更新方式取决于你想要实现的具体功能。详细的操作类型和参数值可以在相关的文档或参考资料中找到。

●获取鼠标位置:GetCursorPos

BOOL GetCursorPos(

  LPPOINT lpPoint // 接收鼠标位置的指针

);

该函数用于获取当前鼠标的屏幕坐标位置,并将结果存储在指定的 POINT 结构中。

●设置鼠标位置:SetCursorPos

BOOL SetCursorPos(

  int X, // 鼠标的水平坐标

  int Y  // 鼠标的垂直坐标

);

该函数用于设置鼠标的屏幕坐标位置。通过提供目标位置的水平和垂直坐标,可以将鼠标移动到指定的位置。

       ■鼠标热点

       当Windows用户移动鼠标时,Windows系统会在显示设备上移动一个位图格式的小图 标,称为“鼠标指针”。鼠标指针具有一个单像素精度的“热点”(hot spot)。热点在显示设备上指示了一个精确的位置。当我提到屏幕上鼠标指针的位置时,实际上是指热点的位罝。

Windows为程序提供了几种预定义的鼠标指针。最常用的是斜向箭头,称为 IDC_ARROW(定义在WINUSER.H头文件中的标识符)。

箭头的顶点即为热点。IDC_CROSS指针(被本章后面的BLOKOUT程序所采用)的热点 位于十字形图案的中心。IDC_WAIT指针呈沙漏形(不同的Windows版本会有所不同),一般用在程序中表示忙碌状态。程序员还可以设计属于自己的指针。本书会在第十章讲述如何设计自定义鼠标指针。对一个具体窗口来说,默认的鼠标指针在定义窗口类结构时就被指定了。是否还记得初始化窗口类时指定的鼠标位图?例如:

wndclass.hCursor = LoadCursor (NULL, XDC_ARR0W);

在 Windows 平台上,可以使用以下函数来获取和设置鼠标热点位置:

●获取鼠标热点位置:GetIconInfo

BOOL GetIconInfo(

  HICON      hIcon,       // 光标图标句柄

  PICONINFO  piconinfo    // ICONINFO 结构指针

);

该函数用于获取光标图标的信息,包括光标热点位置。通过传递光标图标的句柄和指向 ICONINFO 结构的指针,可以获取光标图标的热点位置。

●设置鼠标热点位置:SetCursor

HCURSOR SetCursor(

  HCURSOR hCursor // 新的光标句柄

);

该函数用于设置当前光标。通过传递一个新的光标句柄,可以更改当前光标并指定新的热点位置。

显示和隐藏鼠标

●显示/隐藏鼠标光标:ShowCursor

int ShowCursor(

  BOOL bShow // 指定是否显示鼠标光标

);

该函数用于显示或隐藏鼠标光标。通过传递 TRUE 或 FALSE 来决定是否显示鼠标光标。

 ■鼠标消息

       鼠标消息是指在 Windows 系统中与鼠标操作相关的消息。当用户与鼠标进行交互时,系统会生成相应的鼠标消息,以通知应用程序有关鼠标操作的信息。

在 Windows 消息循环中,可以通过检查消息的消息类型来确定是否为鼠标消息,并进一步处理相应的操作。以下是一些常见的鼠标消息:

●WM_MOUSEMOVE:表示鼠标移动消息。当用户移动鼠标时,系统会发送该消息,并包含当前鼠标的屏幕坐标。

●WM_LBUTTONDOWN:表示左键按下消息。当用户按下鼠标左键时,系统会发送该消息,并包含当前鼠标的屏幕坐标。

●WM_LBUTTONUP:表示左键释放消息。当用户释放鼠标左键时,系统会发送该消息,并包含当前鼠标的屏幕坐标。

●WM_RBUTTONDOWN:表示右键按下消息。当用户按下鼠标右键时,系统会发送该消息,并包含当前鼠标的屏幕坐标。

●WM_RBUTTONUP:表示右键释放消息。当用户释放鼠标右键时,系统会发送该消息,并包含当前鼠标的屏幕坐标。

●WM_MOUSEWHEEL:表示鼠标滚轮消息。当用户滚动鼠标滚轮时,系统会发送该消息,并包含滚动的距离和方向。

这些消息是在 Windows 消息循环中使用的常见鼠标消息,你可以在应用程序的消息处理过程中捕获并响应这些消息。使用消息处理函数,如 WndProc,可以通过检查消息的消息类型来处理相应的鼠标操作。

相关文章:

《Windows API每日一练》6.1 鼠标基础知识

本节我们讲述鼠标的一些基础知识。 本节必须掌握的知识点: 鼠标 6.1.1 鼠标 鼠标是1964年由Douglas Engelbart发明的,用来取代由键盘输入的繁琐指令,简化电脑操作。早期的鼠标是单键鼠标,只有一个键,后来逐步改进为双…...

闹大了!OpenAI 宣布终止提供API服务

事件背景: OpenAI宣布终止对中国提供API服务,影响中国大陆的API开发者。受影响的开发者收到OpenAI的警告信,要求7月9日后停止服务。 OpenAI的业务和营收: 2023年营收16亿美元,2024年上半年年化营收达34亿美元。营收来…...

java里的空接口实现它有什么用?

我们在看源码时,经常会看到一些空接口,这些空接口里没有一个方法,实现它有什么作用呢?让我们先找几个常见的空接口看看。 一、Serializable接口 在Java中,一个常见的空接口就是java.io.Serializable。 public inter…...

Spring的jar包下载(最新版6.0版本)

1.在Spring官网的projects下面点击spring-framework 2.进入github官网 3.进入github后往下滑,点击Spring Framework Artifacts 4.往下滑找到 点击 5.在左边先点击Artifacts,在右边找到 libs-snapshot,展开libs-snapshot(之前其他…...

解决Java中数据库连接泄露的技术

解决Java中数据库连接泄露的技术 大家好,我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编,也是冬天不穿秋裤,天冷也要风度的程序猿! 介绍 在Java应用程序中,数据库连接的泄露是一个常见且影响性能的…...

网页视频录制,分享3种好方法

随着互联网的飞速发展,视频内容在网页上的呈现与传播变得日益普遍。网页视频录制作为一种重要的技术手段,不仅方便了我们获取和保存网页上的视频内容,还为教育、娱乐、营销等多个领域提供了全新的应用可能。 但是网页视频怎么录制&#xff1…...

LeNet网络的实现

LeNet网络的实现 import torch from torch import nn from d2l import torch as d2lx 28 net nn.Sequential(nn.Conv2d(1, 6, kernel_size5, padding2), nn.Sigmoid(),nn.AvgPool2d(kernel_size2, stride2),nn.Conv2d(6, 16, kernel_size5), nn.Sigmoid(),nn.AvgPool2d(kerne…...

华为HCIP Datacom H12-821 卷6

1.单选题 下面是一台路由器的部分配置,关于该部分配置描述正确的是,[HUAWEllJip ip-prefix plpermit 10.0.192.0 8 greater-equal 17 less-equal 18 A、10.0.192.0/8 网段内,掩码长度为 20 的路由会匹配到该前缀列表,匹配规则为允许 B、10.0.192.0/8 网段内,掩码长度为…...

深入理解SQL优化:理论与实践的结合

深入理解SQL优化:理论与实践的结合 SQL优化是数据库性能优化的核心,通过优化SQL查询,可以极大地提高数据库的响应速度和资源利用效率。本文将以SQL优化的理论基础和实践应用为主线,结合具体案例,系统化地介绍如何有效…...

PostgreSQL 高级功能与扩展(九)

1. JSONB 数据类型与操作 1.1 JSONB 简介 JSONB 是 PostgreSQL 中的一种数据类型,用于存储 JSON 格式的数据,并提供高效的查询和索引功能。 1.1.1 创建 JSONB 列 CREATE TABLE json_data ( id SERIAL PRIMARY KEY, data JSONB ); 1.2 JSONB 查询与索…...

【LinuxC语言】UDP数据收发

文章目录 前言udp流程图udp函数介绍bind函数recvfrom函数sendto函数示例代码总结前言 在计算机网络中,UDP(用户数据报协议)是一种无连接的传输层协议,它允许应用程序快速地发送短的消息或数据报。由于UDP不需要建立和断开连接,因此它的传输速度往往比其他协议更快,但它也…...

【深度学习驱动流体力学】计算流体力学openfoam-paraview与python3交互

目的1:配置 ParaView 中的 Python Shell 和 Python 交互环境 ParaView 提供了强大的 Python 接口,允许用户通过 Python 脚本来控制和操作其可视化功能。在 ParaView 中,可以通过 View > Python Shell 菜单打开 Python Shell 窗口,用于执行 Python 代码。要确保正确配置 …...

EWM学习之旅-1-EWM100

系统学习一个业务模块已经变得越来越重要,开始吧,EWM! EWM的Learning Journey中包括7本 ebook,100/110/115/120/125/130/140,一本一本的啃吧,相信很多内容是重复的。 EWM100很适合初学者,了解概念术语&…...

qt中的枚举值-QMetaEnum

QMetaEnum 测试代码hcpp 讲解 测试代码 h #include <QMainWindow> #include <QDebug>QT_BEGIN_NAMESPACE namespace Ui { class MainWindow; } QT_END_NAMESPACEclass MainWindow : public QMainWindow {Q_OBJECTpublic:MainWindow(QWidget *parent nullptr);~M…...

这才是CSDN最系统的网络安全学习路线(建议收藏)

01 什么是网络安全 网络安全可以基于攻击和防御视角来分类&#xff0c;我们经常听到的 “红队”、“渗透测试” 等就是研究攻击技术&#xff0c;而“蓝队”、“安全运营”、“安全运维”则研究防御技术。 无论网络、Web、移动、桌面、云等哪个领域&#xff0c;都有攻与防两面…...

微软Edge浏览器多用户配置文件管理:个性化浏览体验

在家庭或工作环境中&#xff0c;经常需要在同一台计算机上为多个用户创建和管理独立的浏览体验。微软Edge浏览器提供了多用户配置文件管理功能&#xff0c;允许用户为每个账户设置独立的书签、历史记录、密码、扩展和设置。本文将详细介绍如何在微软Edge中管理多个用户配置文件…...

10.2 JavaEE——Spring MVC入门程序

要求在浏览器发起请求&#xff0c;由Spring MVC接收请求并响应&#xff0c;具体实现步骤如下。 一、创建项目 在IDEA中&#xff0c;创建一个名称为chapter10的Maven Web项目。 &#xff08;一&#xff09;手动设置webapp文件夹 1、单击IDEA工具栏中的File→“Project Structu…...

Python 处理大量数据的相关库和框架推荐

Python 处理大量数据的相关库和框架推荐 Python 生态系统中存在多个强大的库和框架&#xff0c;它们可以帮助开发者高效地处理大量数据。以下是一些广泛使用的推荐选项&#xff1a; 1. NumPy 一个用于大规模数值计算的科学计算库。提供多维数组对象和相应的操作。 2. Panda…...

【unity笔记】七、Mirror插件使用

一、简介 Mirror 是一个用于 Unity 的开源多人游戏网络框架&#xff0c;它提供了一套简单高效的网络同步机制&#xff0c;特别适用于中小型多人游戏的开发。以下是 Mirror 插件的一些关键特点和组件介绍&#xff1a; 简单高效&#xff1a;Mirror 以其简洁的 API 和高效的网络…...

掌握SEO:如何优化用ChatGPT生成的文章以提升搜索排名

在数字化时代&#xff0c;搜索引擎优化&#xff08;SEO&#xff09;已经成为网站流量的重要来源。随着人工智能技术的进步&#xff0c;越来越多的人开始使用ChatGPT等AI工具来生成文章。然而&#xff0c;虽然这些工具可以快速生成内容&#xff0c;但要确保这些内容在搜索引擎中…...

解决Ubuntu22.04 VMware失败的问题 ubuntu入门之二十八

现象1 打开VMware失败 Ubuntu升级之后打开VMware上报需要安装vmmon和vmnet&#xff0c;点击确认后如下提示 最终上报fail 解决方法 内核升级导致&#xff0c;需要在新内核下重新下载编译安装 查看版本 $ vmware -v VMware Workstation 17.5.1 build-23298084$ lsb_release…...

django filter 统计数量 按属性去重

在Django中&#xff0c;如果你想要根据某个属性对查询集进行去重并统计数量&#xff0c;你可以使用values()方法配合annotate()方法来实现。这里有两种常见的方法来完成这个需求&#xff1a; 方法1&#xff1a;使用annotate()和Count 假设你有一个模型Item&#xff0c;并且你想…...

Python爬虫(二):爬虫完整流程

爬虫完整流程详解&#xff08;7大核心步骤实战技巧&#xff09; 一、爬虫完整工作流程 以下是爬虫开发的完整流程&#xff0c;我将结合具体技术点和实战经验展开说明&#xff1a; 1. 目标分析与前期准备 网站技术分析&#xff1a; 使用浏览器开发者工具&#xff08;F12&…...

Python爬虫(一):爬虫伪装

一、网站防爬机制概述 在当今互联网环境中&#xff0c;具有一定规模或盈利性质的网站几乎都实施了各种防爬措施。这些措施主要分为两大类&#xff1a; 身份验证机制&#xff1a;直接将未经授权的爬虫阻挡在外反爬技术体系&#xff1a;通过各种技术手段增加爬虫获取数据的难度…...

MySQL中【正则表达式】用法

MySQL 中正则表达式通过 REGEXP 或 RLIKE 操作符实现&#xff08;两者等价&#xff09;&#xff0c;用于在 WHERE 子句中进行复杂的字符串模式匹配。以下是核心用法和示例&#xff1a; 一、基础语法 SELECT column_name FROM table_name WHERE column_name REGEXP pattern; …...

OpenLayers 分屏对比(地图联动)

注&#xff1a;当前使用的是 ol 5.3.0 版本&#xff0c;天地图使用的key请到天地图官网申请&#xff0c;并替换为自己的key 地图分屏对比在WebGIS开发中是很常见的功能&#xff0c;和卷帘图层不一样的是&#xff0c;分屏对比是在各个地图中添加相同或者不同的图层进行对比查看。…...

MySQL账号权限管理指南:安全创建账户与精细授权技巧

在MySQL数据库管理中&#xff0c;合理创建用户账号并分配精确权限是保障数据安全的核心环节。直接使用root账号进行所有操作不仅危险且难以审计操作行为。今天我们来全面解析MySQL账号创建与权限分配的专业方法。 一、为何需要创建独立账号&#xff1f; 最小权限原则&#xf…...

Android第十三次面试总结(四大 组件基础)

Activity生命周期和四大启动模式详解 一、Activity 生命周期 Activity 的生命周期由一系列回调方法组成&#xff0c;用于管理其创建、可见性、焦点和销毁过程。以下是核心方法及其调用时机&#xff1a; ​onCreate()​​ ​调用时机​&#xff1a;Activity 首次创建时调用。​…...

AI病理诊断七剑下天山,医疗未来触手可及

一、病理诊断困局&#xff1a;刀尖上的医学艺术 1.1 金标准背后的隐痛 病理诊断被誉为"诊断的诊断"&#xff0c;医生需通过显微镜观察组织切片&#xff0c;在细胞迷宫中捕捉癌变信号。某省病理质控报告显示&#xff0c;基层医院误诊率达12%-15%&#xff0c;专家会诊…...

无人机侦测与反制技术的进展与应用

国家电网无人机侦测与反制技术的进展与应用 引言 随着无人机&#xff08;无人驾驶飞行器&#xff0c;UAV&#xff09;技术的快速发展&#xff0c;其在商业、娱乐和军事领域的广泛应用带来了新的安全挑战。特别是对于关键基础设施如电力系统&#xff0c;无人机的“黑飞”&…...