消息处理
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;
}