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学习笔记第三章 的相关文章

  • 【C#】VS2019 未能在命名空间“Microsoft.Win32”中找到类型名“RegistryKey” 的解决办法

    文章目录 前言解决方案 结语 前言 今天在写 C 实验的时候遇到了 未能在命名空间 Microsoft Win32 中找到类型名 RegistryKey 此类型已转发到程序集 Microsoft Win32 Registry Version
  • Win32控制台应用程序点击关闭按钮后如何等待当前任务处理完成后再结束应用

    在开发控制台应用程序时经常会遇到一种情况 xff0c 就是当点击关闭按钮时程序仍在处理一些任务 xff0c 此时如果强制退出会导致任务处理异常 因此 xff0c 程序需要响应点击关闭按钮的事件并等待当前任务处理完成 具体方法如下 xff0c
  • zlib win32编译

    1 run cmd 2 34 C Program Files x86 Microsoft Visual Studio 2019 Community VC Auxiliary Build vcvars32 bat 34 3 nmake f w
  • 常见 win32.com 操作

    import win32com client from win32api import RGB xlapp 61 win32com client gencache EnsureDispatch 34 Ket Application 34 x
  • 学 Win32 汇编[28] - 跳转指令: JMP、JECXZ、JA、JB、JG、JL、JE、JZ、JS、JC、JO、JP 等

    跳转指令分三类 一 无条件跳转 JMP 二 根据 CX ECX 寄存器的值跳转 JCXZ CX 为 0 则跳转 JECXZ ECX 为 0 则跳转 三 根据 EFLAGS 寄存器的标志位跳转 这个太多了 根据标志位跳转的指令 JE 等于则跳
  • VC实现对话框窗口任意分割

    最近写MFC的程序 想在对话框里实现窗口的任意分割 现在网络资料一大抄 找个东西实在麻烦 总算这个很简单 很快就搞定了 写下来做个笔记 个人认为简单问题最好就是直接贴源代码 一看就明白 说来说去反而弄不清楚 那我就少废话了 自己看吧 注释很
  • 转:windows消息传递机制

    Windows是一个消息 Message 驱动系统 Windows的消息提供了应用程序之间 应用程序与Windows系统之间进行通信的手段 应用程序想要实现的功能由消息来触发 并且靠对消息的响应和处理来完成 必须注意的是 消息并非是抢占性的
  • mciSendString的介绍

    转载至 http blog sina com cn s blog 149e9d2ec0102wzcn html 使用MCI API 源文件中需要包含头文件Mmsystem h 在Project gt Settings gt Link gt
  • OSG+MyGUI结合下中文输入的若干问题

    好久又没写文章了 经过这两天的研究 终于搞定了OSG MYGUI的中文输入问题 现在进行一下所遇问题的汇总 方便自己以后查阅 问题1 小键盘数字的输入问题 这个是很久以前解决的 osg并不能给你真正的小键盘输入值 还是得自己处理 代码片段1
  • 编程实现木马的ActiveX启动和注入IE的启动方式

    木马的启动方式有很多种 现在比较流行的就是注册为系统服务启动 只适合Windows 2000以上的系统 或者以驱动的方式启动 不过 最近以ActiveX方式启动又比较流行了 因为它适合Windows 9x或2000以上的机器 而且杀毒软件
  • MFC视频教程(孙鑫)学习笔记2-掌握C++

    这一集中 主要总结了C 经典语法与应用 1 C 的三大特性 封装 继承 多态 2 C 中提供了一套输入输出流类的对象 它们是cin cout和cerr 对应c语言中的三个文件指针stdin stdout stderr 分别指向终端输入 终端
  • 让CPU画出图形(其实很简单的)

    本例子是当初微软的一个题目 希望windows任务管理器的CPU的占有率 是一个正旋曲线 如果是你 你会如何解决这个问题呢 先上图吧 由于cpu要处理其他电脑程序 只能画出来大概的模样 其实我当时想这个问题时候 是不是考虑对cpu进行操作
  • windows 各种消息

    win32 消息
  • GDI 绘图

    目录 GDI 绘图 画点 画线 画封闭图形 画笔 画刷 其他 DC Device Context 绘图设备 HDC 绘图设备句柄 GDI Microsoft Graphics Device Interface Win32提供的绘图API G
  • win32读取注册表

    直接代码 bool bIsIE6 false HKEY hKey NULL DWORD dwType DWORD dwSize LONG lReg RegOpenKey HKEY CLASSES ROOT HTTP shell open c
  • Windows编程基础--第2节 win32程序资源管理

    操作系统 win10 64位 IDE vc 6 0 windows程序都有自己的资源 例如按钮 图标 对话框等等 这节介绍如何使用win32程序资源管理 1 继续使用上节的win32程序demo 执行File gt new添加资源 选择Fi
  • windows 消息机制

    windows 操作系统是由事件驱动的 也叫消息机制 一般来说分为四步 用户动作也就是事件 gt windows 将事件翻译成消息 gt 将消息放入消息队列 gt 消息循环从消息队列中取出消息并发送给窗口处理程序 我们来看一下窗口最简单窗口
  • WiFiAssistant 无线承载网络设置助手的开发历程(一)

    今年6月中旬 我曾经基于MFC写过一个WiFiHelper的小程序 开启和关闭虚拟WiFi 并且能够支持定时关机 当然 真正使用虚拟WiFi还需要手动设置共享 并且 由于我的是台式机 所以并没有去升级WiFiHelper 估计是即将毕业的缘
  • 19_复制目录下所有文件夹和目录CopyFile()

    复制目录下所有文件夹和目录CopyFile 想一下 若要复制文件夹 可以在目录位置新建一个文件夹 然后将源文件夹中里面的文件进行遍历 一个一个的复制到目标文件夹中即可 void EnumCopyFile 输入参数 TCHAR szSrcRo
  • 模态对话框与非模态对话的几种销毁方法与区别

    前几天发现自己的程序中使用非模态对话框 Debug版本有警告提示如下 Warning calling DestroyWindow in CWnd CWnd OnDestroy or PostNcDestroy in derived clas

随机推荐

  • 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种不同的消息来传递不同的键盘事件 但是其中的大部分是我们一般不会去处理的