Win32API学习笔记第三章

2023-11-12

这次记录的是鼠标与键盘的消息和部分相应API的使用如与标准(本人学的是Win程序设计第五版)有偏差,或哪里有不妥,欢迎大家给予斧正!

一:键盘(初阶)

Windows有8种不同的消息来传递不同的键盘事件,但是其中的大部分是我们一般不会去处理的,比如一些常用到系统功能的几件,一般情况下我们是不用去刻意去监视这些消息的(除非你要搞事情2333),通常情况下这些消息都会传给DefWindowProc(默认的窗口过程)
每一个键盘的KeyUp和Down都只有一个窗口过程可以接收,此时接受待定的键盘事件的窗口具有输入焦点(Focus)

消息:

一:WM_SETFCOUS和WM_KELLFCOUS

我们通过名字可以知道这两个消息就是在获得焦点和失去焦点的时候产生的,

二:击键消息:

WM_KEYDOWN&UP和WM_SYSKEYDOWN&UP

Down和UP一般是成对出现的
其中这两种击键消息一个是系统的一个是非系统的(SYS)SYS的一般主要是与Alt的组合击键产生的,一般我们是不会去管SYSKEYDOWN和SYSKEYUP的都是由经默认的窗口过程来处理。


在这四个击键消息产生时wParam参数和lParam参数分别是:
wParam:虚拟键码,也就是大概不能被显示出来的字符所代表的如回车,Backspace等,但是却有相应的标识符与其对应
lParam:这个参数的32个位分为了六个几件消息域
大概是:0~15是重复计数用的,16~26是OEM扫描码,24是扩展键标志,31是转换状态,30是键的先前状态(是否是释放或是被按下的),29是环境代码(系统击键和非系统击键例如对于KEYDOWN这一位是0对于SYSKEYDOWN这一位是1)

三:字符消息:

还记得之前的,那个在消息循环里面出现的TranslateMessage函数吗?没错,这个玩意就是将击键消息转换为字符的(才编码表中存在的字符或者说是击键消息(组合)产生了一个字符)此时这个消息将放入击键消息的下一个消息
下面说说4类字符消息:

WM_CHAR和WM_SYSCHAR,以及相应的死字符(DEADCHAR)

此时和击键消息不同的是wParam变成了相应的ANSI(UNICODE)编码

四:插入符:

还记得刚开始的那两个关于焦点的消息嘛?没错,对于插入符,配上这两个信息就可以模拟出控制台的效果了:
当收到WM_SETFOCUS时就可以运行CreateCaret了这个时候就会创建一个和这个窗口有关的插入符,并且依次调用SetCaretPos和ShowCaret来设置其位置并显示出来
当收到WM_KILLFOCUS时就可以运行HideCaret和DestoryCaret来隐藏并销毁这个插入符

二:鼠标

其实鼠标在早期的Windows设计时是被当作一个非必需品设计的,因为在现在的窗口操作中每个按钮其实都对应了一个等价的键盘操作,但是随着时代的进步,现在的Windows是需要鼠标的。
现在言归正传,对于鼠标:

消息:

WM_?BUTTONDOWN&UP&DBLCLK

WM_NC?BUTTONDOWN&UP&DBLCLK

其中的?可以是L,M,R(左,中,右)
带有NC的消息则时在非客户区产生的鼠标击键消息
故名思意这个就是在单击和双击产生的三个消息

WM_MOUSEMOVE&NC~

这个就是鼠标移过客户区时产生的消息,但是并不是每一个像素都产生这个消息,这个消息的产生次数依赖于计算机的处理速度


对于上面客户区产生的这几个消息,参数lParam的高低位就是产生这个消息时鼠标对应客户区的像素坐标,wParam则指示了鼠标键及Shift和Ctrl建的状态
而下面非客户区的消息,参数lParam则是相对于屏幕的坐标,wParam则是指明了移动或单击鼠标键的非客户区的位置,它一般值与HT(命中测试)开头的宏定义相对

WM_NCHITTEST

这个消息时21个鼠标消息的最后一个消息他就是“非客户区命中测试”
这个消息是一个比较特殊但是在Windows中是非常普遍的消息,Windows一般是把这个消息传给DefWindowProc并且这个消息的除法优于所有客户区以及非客户区的鼠标消息,其中lParam时相对于屏幕的坐标,wParam没有用处
然而,当DefWinodwProc处理完以后其返回值将保留到wParam里面这个值有一下内容:
HTCLIENT客户区
HTNOWHERE不在窗口中
HTTRANSPARENT窗口由另一个窗口覆盖
HTERROR使DefWindowProc产生蜂鸣声
结合上面所说的这个消息后的鼠标消息的wParam的值我们可以知道,这四个消息的值可以加上任意之前非客户区的鼠标消息如果我们在自己的Proc中捕获了这人个消息,那么后果就是鼠标将失效
这个消息之所以特殊是因为这个消息在被捕获并执行之后会接着产生一个鼠标的消息并且wParam的值会按照之前四个参数的鼠标的所处情况而定


下面这个是我对前面记个笔记的一个总结的小程序,虽然有一些错误,但是大概功能都是有的,主要是模拟了一个简易的控制台窗口,这个为我后面自己写一个8086汇编的简易的编译器打下了一个基础
代码质量不高,忘打手轻喷,并给予斧正,谢谢!

#include "stdafx.h"
#include "Win32ProjectWithAASM.h"

#define MAX_LOADSTRING 100

// 全局变量: 
HINSTANCE hInst;                                // 当前实例
WCHAR szTitle[MAX_LOADSTRING];                  // 标题栏文本
WCHAR szWindowClass[MAX_LOADSTRING];            // 主窗口类名

// 此代码模块中包含的函数的前向声明: 
ATOM                MyRegisterClass(HINSTANCE hInstance);
BOOL                InitInstance(HINSTANCE, int);
LRESULT CALLBACK    WndProc(HWND, UINT, WPARAM, LPARAM);
INT_PTR CALLBACK    About(HWND, UINT, WPARAM, LPARAM);

int APIENTRY _tWinMain(_In_ HINSTANCE hInstance,
                     _In_opt_ HINSTANCE hPrevInstance,
                     _In_ LPWSTR    lpCmdLine,
                     _In_ int       nCmdShow)
{
    UNREFERENCED_PARAMETER(hPrevInstance);
    UNREFERENCED_PARAMETER(lpCmdLine);

    // TODO: 在此放置代码。

    // 初始化全局字符串
    LoadStringW(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING);
    LoadStringW(hInstance, IDC_WIN32PROJECTWITHAASM, szWindowClass, MAX_LOADSTRING);
    MyRegisterClass(hInstance);

    // 执行应用程序初始化: 
    if (!InitInstance (hInstance, nCmdShow))
    {
        return FALSE;
    }

    HACCEL hAccelTable = LoadAccelerators(hInstance, MAKEINTRESOURCE(IDC_WIN32PROJECTWITHAASM));

    MSG msg;

    // 主消息循环: 
    while (GetMessage(&msg, nullptr, 0, 0))
    {
        if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
        {
            TranslateMessage(&msg);
            DispatchMessage(&msg);
        }
    }   
    return (int) msg.wParam;
}



//
//  函数: MyRegisterClass()
//
//  目的: 注册窗口类。
//
ATOM MyRegisterClass(HINSTANCE hInstance)
{
    WNDCLASSEXW wcex;

    wcex.cbSize = sizeof(WNDCLASSEX);

    wcex.style          = CS_HREDRAW | CS_VREDRAW;
    wcex.lpfnWndProc    = WndProc;
    wcex.cbClsExtra     = 0; 
    wcex.cbWndExtra     = 0;
    wcex.hInstance      = hInstance;
    wcex.hIcon          = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_WIN32PROJECTWITHAASM));
    wcex.hCursor        = LoadCursor(nullptr, IDC_ARROW);
    wcex.hbrBackground  = (HBRUSH)(COLOR_WINDOW+1);
    wcex.lpszMenuName   = MAKEINTRESOURCEW(IDC_WIN32PROJECTWITHAASM);
    wcex.lpszClassName  = szWindowClass;
    wcex.hIconSm        = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_SMALL));

    return RegisterClassExW(&wcex);
}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Win32API学习笔记第三章 的相关文章

  • 用Javascript实现随机抽奖

    用Javascript实现随机抽奖 思路 首先我们先把一组元素保存到数组arr中 再利用随机生成的整数和数组下标关联起来 这里的重点就是怎样获取随机的整数 下面跟着我一起来看看 HTML部分

随机推荐

  • Linux基础命令

    命令 关闭防火墙1 systemctl stop firewalld service 关闭防火墙程序 systemctl disable firewalld service 关闭开机自启动 关闭防火墙2 firewall cmd set d
  • UVM基础-m_sequencer和p_sequencer

    一 Sequencer问题的由来 1 1 sequence与sequencer之间的数据交互 在UVM的sequence机制中 sequence其实是独立与验证环境之外的部件 作为uvm object而存在 那么sequence最终是要在某
  • VSAN故障案例分享——超经典三场景

    前言 虽然个人认为现VSAN的常规运维都已经很成熟便捷了 像磁盘更换 但还是有诸多需要注意的地方 近期又突然跟VSAN项目有了一些交集 整理原有资料时 发现有几个不错的案例 故拿出来出大家分享下 如有不足之处 也希望大佬们帮指正
  • 基于双向门控循环单元(BIGRU)的数据分类预测。matlab代码,要求2020及以上版本。多特征输入单输出的二分类及多分类模型。程序内注释详细,直接替换数据就可以用。程序可出分类效果图,迭代

    清空环境变量 warning off 关闭报警信息 close all 关闭开启的图窗 clear 清空变量 clc 清空命令行 读取数据 res xlsread 数据集 xlsx 分析数据 num class length unique
  • FreeRtos移植到stm32

    每次都忘记怎么移植 还是在此记录下来比较好 1 打开官网FreeRTOS Free RTOS Source Code Downloads the official FreeRTOS zip file release download2 下载
  • 【安装部署】Mysql下载及其安装的详细步骤

    1 下载压缩包 官网地址 www mysql com 2 环境配置 1 先解压压缩包 2 配置环境变量 添加环境变量 我的电脑 gt 属性 gt 高级 gt 环境变量 gt 系统变量 gt path 3 在mysql安装目录下新建my in
  • 如何处理海量数据文件以及大文件数据查找

    目录 一 处理海量整数文件 问 假定有40亿个无符号整数 判断某数据是否在其中 问 假定有40亿个无符号整数 找到只出现一次的数据 两次 三次 问 两个文件各有100亿个整数 只有1G内存 找交集整数 二 处理海量数据 非整数 文件 问 超
  • matlab算出中心差分方法_美赛准备第12期丨美赛ABCDEF题型分析与建模方法

    美赛还有十多天的时间就正式开始了 参赛的小伙伴准备好咯吗 美国大学生数学建模竞赛有MCM和ICM MCM Mathematical Contest in Modeling 为数学建模竞赛 ICM The Interdisciplinary
  • 微信的信息会保存在苹果服务器上吗,【每日一技】如何将微信文件保存到 iPhone 里?...

    由于 iOS 系统的封闭性 在 iPhone 本地储存文件一直是一件麻烦事 特别是在微信内收到很多文件之后 分类管理更加不便 如果长时间未操作 文件还可能永久失效 今天小编图文详解 如何解决 iOS 存储文件问题以及如何在 iOS 内找到文
  • 透明网关

    Oracle与SQL Server的互连 不同数据库平台的互连一般称之为数据库的异构服务 现在各大数据库之间都可以实现这样的异构互连 只是各厂商的具体实现技术不一样 如 在SQL SERVER里面叫做LINKED SERVER 通过ODBC
  • 人工智能从头学(一)

    人工智能从头学 一 Python基础 本系列是对人工智能学习之路的一次复现与总结 适合期末突击复习概念知识点 回顾人工智能知识体系等场景 本文对纯小白极不友好 至少至少对计算机方向有个大概的了解 如有纰漏 欢迎指正 暂定计划 Python基
  • centos7 使用libvirt创建kvm虚拟机并vnc连接

    文章目录 环境 安装libvirt 查看libvirt的一些默认配置 查看libvirt的默认网络配置 kvm虚拟机搭建与连接 创建虚拟机 创建磁盘 下载镜像 使用libvirt创建kvm虚拟机 libvirt常用参数 创建kvm常用指令
  • android上实现Table

    package com android import java util ArrayList import java util HashMap import java util List import java util Map impor
  • 机器学习(十八) 方差、标准差、协方差、协方差矩阵、相关系数

    实例计算 学习数学理论发现还是懂了理论自己算一算 印象才深刻 记忆才清晰 并且在整理计算过程中会使得想法进一步加深 挖掘出来表面想象够不到的地方 先来看看统计学定义 大意是通过各种研究方法研究某一现象的内在规律 促进科学发展 统计学 统计学
  • Python 编写shell脚本

    详细讲解 shell中常用的是ls命令 python的写法是 os listdir dirname 这个函数返回字符串列表 里面是所有的文件名 不过不包含 和 os listdir python 把当前工作目录切换到dirname下 os
  • 30天学习之-自动化测试

    30天学习之 自动化测试 工具类实现自动化测试 1 postman自动化测试 1 postman Tests下写脚本 2 newman生成postman的测试报告 2 Jmter 基本操作 jmter基本元件 切换中文简体 登陆请求界面 自
  • 【精】与HDFS相关的Linux基础知识:内核是怎么保存文件描述符相关数据结构的?

    研究分布式文件存储系统 少不了与底层操作系统 文件系统 存储设备等打交道 了解这些基本原理对我们全方位理解分布式存储 问题定位 性能优化等有很大帮助 大家都知道 在linux中 一切都是文件 对文件的操作都是通过打开此文件拿到文件描述符 然
  • 数字大写

    人民币大写数字注意事项 中文大写金额数字应用正楷或行书填写 如壹 贰 叁 肆 伍 陆 柒 捌 玖 拾 佰 仟 万 亿 元 角 分 零 整 正 等字样 不得用一 二 两 三 四 五 六 七 八 九 十 廿 毛 另 或0 填写 不得自造简化字
  • OpenCV支持中文字符输出实现

    在 http www opencv org cn forum php mod viewthread tid 2083 extra page 1 中 作者给出了原始的在OpenCV中 支持中文字符的输入 原始的实现使用的是OpenCV的C接口
  • Win32API学习笔记第三章

    这次记录的是鼠标与键盘的消息和部分相应API的使用如与标准 本人学的是Win程序设计第五版 有偏差 或哪里有不妥 欢迎大家给予斧正 一 键盘 初阶 Windows有8种不同的消息来传递不同的键盘事件 但是其中的大部分是我们一般不会去处理的