windows消息处理机制

消息,就是指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

原文地址:https://www.cnblogs.com/kuangxiangnice/p/11213498.html