C++黑客小白的进阶之路(第一世界初识Windows编程之第一关)——Windows的消息机制

C++黑客小白的进阶之路(第一世界初识Windows编程之第一关)——Windows的消息机制_第1张图片

哈罗大家好,我是你们最喜欢的蒟蒻君~

从今天开始,蒟蒻君要和大家一起学习C++黑客啦!!
注:代码在DEV-C++这些针对算法编程的编译器上是编译不了的,需要用vscode或者vc才行。

文章目录

  • 简介:消息机制?
    • 消息机制是哈?
    • 消息是怎么生成哒?
    • 如何表示一个消息?
  • 初探API函数(FindWindow和SendMessage函数)
    • FindWindow
    • SendMessage
  • 调试消息机制:查看记事本属性

简介:消息机制?

消息机制是哈?

Windows中应用是基于消息机制哒~ 消息,就是系统生成的一个32位(相当于int类型)的值,这个值就想系统说明了一个事件 (不会重复)。比如用户点了一下鼠标,敲了一下键盘,或者拖动了一下窗口,这些都会报告给Windows。
C++黑客小白的进阶之路(第一世界初识Windows编程之第一关)——Windows的消息机制_第2张图片
了解完什么是Windows的消息机制,大家可能会想:Windows是怎么生成这样的一个数呢?一个操作有那么多属性,又怎么能保证任意两个消息均不相同呢?

消息是怎么生成哒?

相信句柄(HWND)大家都吉岛,布吉岛的小伙伴可以看这篇文章。
先看看消息在windows中的定义叭(消息就是MSG哦)~

struct tagMsg {
     
    HWND hwnd; //  窗口句柄
    UINT message; // 消息的值
    WPARAM wParam; // 用于保证消息各不相同的东东
    LPARAM lParam; // 同上一个
    DWORD time; // 这个消息是什么时候创建的
    POINT pt; // 创建消息的时候光标在哪里(坐标)
} MSG;

小伙伴们懂了叭~
一个小小的消息也是包含了很多属性,所以不可能有两个消息相同啦~~

如何表示一个消息?

C++黑客小白的进阶之路(第一世界初识Windows编程之第一关)——Windows的消息机制_第3张图片
真正有用的消息值在0x0000在0x03ff之间(0x就是用16进制表示)。而且,程序不能用这些消息指值给自己的消息(这些都是系统要用的)。
应用程序用的消息是从0x0400到0x7fff,或者从0xc000到0xffff的(电脑不一样这个就不一样)。
下一步,我们要认识一些消息类型(看不懂可以忽略)

消息类型 值的范围
空哒 WM_NULL到0x0000
关于 0x0001至0x0087
系统 0x00A0至0x00A9
键盘 0x0100至0x0108
菜单 0x0111至0x0126
颜色控制 0x0132至0x0138
鼠标 0x0200至0x020A
菜单循环 0x0211至0x0213
多文档 0x0220至0x0230
决策系统 0x0400
客户端 0x8000
应用自定义 0x0400至0x7FFF

好啦~大功告成!作为一个小白白 (大佬忽略),我们就先认识这些关于消息的东东叭,剩下的以后就会学到。

初探API函数(FindWindow和SendMessage函数)

API函数就是接口函数,为了方便我们编写接口公开的。
那么我们的第一个黑客程序需要用到什么函数呢?
Let’s go~~

FindWindow

作用:

通过窗口名找到窗口句柄。

定义:
LPCSTR = const TCHAR*

HWND FindWindow(
    LPCTSTR lpClassName,	// 窗口类的名称
    LPCTSTR lpWindowsName	// 窗口的名称(窗口标题)
);

程序中的运用:

在代码里面,因为窗口的名称会改变(这里我们写了一个编辑窗口标题的函数edit),所以只能用窗口类名来找句柄啦~

SendMessage

作用:

通过句柄确定窗口,然后将消息发过去。

定义:
UINT = unsigned int
WPARAM = UINT
LPARAM = LONG

LRESULT SendMessage(
	HWND hWnd,
	UINT Msg,
	WPARAM wParam,
	LPARAM lParam
};

补充:几个消息的具体含义

WM_CLOSE:拿到这个消息的窗口必须关闭(最后两个参数莫有用处,为NULL)
WM_SETTEXT:拿到这个消息的窗口必须设置下里面的文字(不用用wParam,lParam指向结尾为NULL的文本)
WM_GETTEXT:拿到这个消息的窗口里面的文本会被copy下来(wParam是要复制前多少个字符,lParam是复制到哪里)

C++黑客小白的进阶之路(第一世界初识Windows编程之第一关)——Windows的消息机制_第4张图片

调试消息机制:查看记事本属性

#include 
// 获取记事本标题
void get_name() {
     
    HWND h = ::FindWindow(L"Notepad", NULL);
    if (h == NULL) {
     
        MessageBox(NULL, L"莫有记事本哦~", L"蒟蒻君提示", MB_OK);
        return;
    }
    char s[MAXBYTE] = {
     0};
    ::SendMessage(h, WM_SETTEXT, (WPARAM)0, (LPARAM)s);
    MessageBox(NULL, (LPCWSTR)s, L"蒟蒻君提示", MB_OK);
}
// 编辑记事本标题
void edit() {
     
    HWND h = ::FindWindow(NULL, L"无标题 - 记事本");
    if (h == NULL) {
     
        MessageBox(NULL, L"莫有记事本哦~", L"蒟蒻君提示", MB_OK);
        return;
    }
    ::SendMessage(h, WM_SETTEXT, (WPARAM)0, (LPARAM)"调试");
}
// 运行记事本
void run() {
     
    WinExec("notepad.exe", SW_SHOW);
}
// 关闭记事本
void close() {
     
    HWND h = ::FindWindow(L"Notepad", NULL);
    if (h == NULL) {
     
        MessageBox(NULL, L"莫有记事本哦~", L"蒟蒻君提示", MB_OK);
        return;
    }
    ::SendMessage(h, WM_CLOSE, NULL, NULL);
}

C++黑客小白的进阶之路(第一世界初识Windows编程之第一关)——Windows的消息机制_第5张图片

你可能感兴趣的:(C++黑客小白的进阶之路,windows,c++,vscode)