zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    beeline链接hive报错
    Java并发之FairSync和NonfairSync
    如何在 Linux 中将文件编码转换为 UTF-8
    Spring Boot运行原理
    jvm垃圾回收
    jvm调试工具
    Nginx相关
    docker 配置jar ,运行
    centos7的一些安装问题
    Docker
  • 原文地址:https://www.cnblogs.com/kuangxiangnice/p/11213498.html
Copyright © 2011-2022 走看看