【免杀前置课——Windows编程】四、Windows通用消息(窗口消息、命令消息、通知消息)、Windos控件消息(用户自定义消息、PostMessage、SendMessage)

消息处理

Windows通用消息:

Windows通用消息标志都定义在WINUSER.H中,以WM_开头即WindowsMessage,大体分为三类。

1、窗口消息

例如:WM_CREATE,WM_CLOSE

2、命令消息

特指WM_COMAND消息,与处理用户请求有关,如点击菜单项,工具栏,控件等就会产生命令消息。

3、通知消息

特指WM_NOTIFY 消息,只使用用windows 的公共控件,如列表,视图等。

Windos控件消息

控件消息是用于控制控件的一些行为的,不同的空间有不同的控制消息,命名规则如下:
BM_按钮控制消息
EM_编辑框控制消息
STM_静态文本控制消息
CM_组合框控制消息
LBM_列表框控制消息

用户自定义消息

自定义消息可以定义在系统的消息区外,即消息位置大于WM_USER。

const UINT WM_USERMSG = WM_USER + 1;//自定义消息定义在系统的消息区外,即消息位置大于WM_USER

消息的发送

PostMessage、SendMessage
PostMessage会将消息发送到消息队列,应用程序的消息循环会最终得到消息,并分发给回调函数。
SendMessage.,相当于直接调用窗口的回调函数,等待窗口过程处理结束并返回结果。
根据发送消息的方式不同,消息分为两类:
队列消息、非队列消息。

通过消息发送关闭相应程序窗口

在这里插入图片描述
通过右键触发关闭qq句柄。

#include<Windows.h>
#include<iostream>
#include<tchar.h>

const UINT WM_USERMSG = WM_USER + 1;//自定义消息定义在系统的消息区外,即消息位置大于WM_USER

void print(LPCWSTR format, ...)
{
	WCHAR wchar_buff[100]{ 0 };
	va_list arglist;
	va_start(arglist,format);//指针指向指向format的下一个参数
	wvsprintfW(wchar_buff,format,arglist);
	va_end(arglist);
	OutputDebugStringW(wchar_buff);
}	

LRESULT CALLBACK Wndproc(
	_In_ HWND	hwnd,
	_In_ UINT	uMsg,
	_In_ WPARAM wParam,//字参数:通常用来传递别的参数,两个参数都是32位
	_In_ LPARAM lParam//长参数:低四位指向鼠标X坐标,高四位指向鼠标Y坐标,通常用来传送地址
) 
{
	switch (uMsg)
	{
	case WM_CREATE:
		MessageBoxW(hwnd, L"窗口创建了", L"提示", MB_OK);
		break;
	case WM_CLOSE:
		MessageBoxW(hwnd, L"窗口关闭了", L"提示", MB_OK);
		DestroyWindow(hwnd);
		PostQuitMessage(0);//像系统指示线程请求终止(退出)
		break;
	case WM_MOUSEMOVE:
	{	
		WORD X = LOWORD(lParam);
		WORD Y = HIWORD(lParam);
		print(L"鼠标移动了!X坐标%d,Y坐标%d\n", X, Y);
		break;
	}
	case WM_LBUTTONDOWN:
		print(L"鼠标左键按下了\n");
		SendMessageW(hwnd,WM_USERMSG,wParam,lParam);//发送消息到回调函数中WM_USERMSG消息
		break;
	case WM_USERMSG:
		print(L"自定义消息\n");
		break;
	case WM_RBUTTONDOWN://鼠标右键触发
		SendMessageW((HWND) 0X00010A0A,WM_CLOSE,0,0);//向qq句柄窗口发送关闭消息
		break;
	}
	
	return DefWindowProcW(hwnd, uMsg, wParam, lParam);
}

int WINAPI WinMain(
	HINSTANCE hInstance,
	HINSTANCE hPreInstance,
	LPSTR lpCmdLine,
	int nCmdShow
) 
{
	//1、创建窗口类
	WNDCLASSW myClass = { 0 };
	myClass.lpszClassName = L"dsdHook";
	myClass.lpfnWndProc = Wndproc;//窗口回调函数	
	//2、注册窗口类
	RegisterClassW(&myClass);
	//3、创建窗口
	HWND hwindow = CreateWindowW(
		myClass.lpszClassName,
		L"dsdHook",
		WS_OVERLAPPEDWINDOW,//样式
		CW_USEDEFAULT,//x坐标
		0,//y坐标
		CW_USEDEFAULT,//宽度
		0,//高度
		NULL,//窗口句柄
		NULL,
		hInstance,//应用实例句柄
		0//回调函数
	);
	//4、显示窗口
	ShowWindow(hwindow, SW_SHOWNORMAL);
	//5、获取消息
	MSG msg = { 0 }; //指向包含消息的结构的指针。
	while (GetMessageW(&msg,0,0,0)) //第二个参数0代表接受所有窗口的返回值
	{
		DispatchMessageW(&msg);//分发消息给消息处理(回调)函数
	}
	
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

webfker from 0 to 1

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值