消息,就是指Windows发出的一个通知,告诉应用程序某个事情发生了。例如,单击鼠标、改变窗口尺寸、按下键盘上的一个键都会使Windows发送一个消息给应用程序。
消息内容包括:
hwnd
32位的窗口句柄。窗口可以是任何类型的屏幕对象,因为Win32能够维护大多数可视对象的句柄(窗口、对话框、按钮、编辑框等)。
message
用于区别其他消息的常量值,这些常量可以是Windows单元中预定义的常量,也可以是自定义的常量。
wParam
通常是一个与消息有关的常量值,也可能是窗口或控件的句柄。
lParam
通常是一个指向内存中数据的指针。
由于WParam、lParam和Pointer都是32位的,即等同于DWORD。因此,它们之间可以相互转换。
对于WinForm和WPF应用,以检测U盘插拔为例,记录windows消息接收处理:
public const int WM_DEVICECHANGE = 0x219; //U盘插入后,OS的底层会自动检测到,然后向应用程序发送“硬件设备状态改变“的消息 public const int DBT_DEVICEARRIVAL = 0x8000; //U盘插入 public const int DBT_DEVICEREMOVECOMPLETE = 0x8004; //U盘卸载
Winform:
protected override void WndProc(ref Message m) { if (m.Msg == WM_DEVICECHANGE) { switch (m.WParam.ToInt32()) { case DBT_DEVICEARRIVAL://U盘插入 // break; case DBT_DEVICEREMOVECOMPLETE: //U盘卸载 // break; default: break; } } base.WndProc(ref m); }
WPF窗体中未实现WndProc函数,需要HwndSource对象添加消息处理回调函数。
private void MainWindow_Loaded(object sender, RoutedEventArgs e) { HwndSource hwndSource = PresentationSource.FromVisual(this) as HwndSource; if (hwndSource != null) { hwndSource.AddHook(new HwndSourceHook(WndProc)); } } private IntPtr WndProc(IntPtr hwnd, int msg, IntPtr wParam, IntPtr lParam, ref bool handled) { if (msg == WM_DEVICECHANGE) { switch (wParam.ToInt32()) { case DBT_DEVICEARRIVAL://U盘插入 // break; case DBT_DEVICEREMOVECOMPLETE: //U盘卸载 // break; default: break; } } return IntPtr.Zero; }
通过类似写法,使用WPF或WinForm处理其他消息。
消息机制参考:http://www.cppblog.com/suiaiguo/archive/2009/07/18/90412.html
消息大全参考:https://blog.csdn.net/nupt123456789/article/details/7370562