C# Winform中WndProc 函数作用:
主要用在拦截并处理系统消息和自定义消息
比如: windows程序会产生很多消息,比如你单击鼠标,移动窗口都会产生消息。这个函数就是默认的消息处理函数。你可以重载这个函数来制定自己的消息处理流程.
在Winform程序中,可以重写WndProc函数,来捕捉所有发生的窗口消息。
这样,我们就可以"篡改"传入的消息,而人为的让窗口改变行为。
我们用C#实现检测U盘插拔的功能,是用重写C# WndProc函数来做到的。
简单测试代码:
using System;using System.Collections.Generic;using ponentModel;using System.Data;using System.Drawing;using System.Linq;using System.Text;using System.Threading.Tasks;using System.Windows.Forms;using System.IO; //添加IO命名空间namespace CheckUdisk{public partial class Form1 : Form{//定义常量public const int WM_DEVICECHANGE = 0x219;public const int DBT_DEVICEARRIVAL = 0x8000;public const int DBT_CONFIGCHANGECANCELED = 0x0019;public const int DBT_CONFIGCHANGED = 0x0018;public const int DBT_CUSTOMEVENT = 0x8006; public const int DBT_DEVICEQUERYREMOVE = 0x8001;public const int DBT_DEVICEQUERYREMOVEFAILED = 0x8002;public const int DBT_DEVICEREMOVECOMPLETE = 0x8004;public const int DBT_DEVICEREMOVEPENDING = 0x8003;public const int DBT_DEVICETYPESPECIFIC = 0x8005;public const int DBT_DEVNODES_CHANGED = 0x0007;public const int DBT_QUERYCHANGECONFIG = 0x0017;public const int DBT_USERDEFINED = 0xFFFF;public Form1(){InitializeComponent();}private void Form1_Load(object sender, EventArgs e){}protected override void WndProc(ref Message m){try{if (m.Msg == WM_DEVICECHANGE){switch (m.WParam.ToInt32()){case WM_DEVICECHANGE:break;case DBT_DEVICEARRIVAL:DriveInfo[] s = DriveInfo.GetDrives();foreach (DriveInfo drive in s){if (drive.DriveType == DriveType.Removable){this.richTextBox1.AppendText("U盘已插入,盘符是" + drive.Name.ToString() + "\r\n");break;}}break;case DBT_CONFIGCHANGECANCELED:MessageBox.Show("2");break;case DBT_CONFIGCHANGED:MessageBox.Show("3");break;case DBT_CUSTOMEVENT:MessageBox.Show("4");break;case DBT_DEVICEQUERYREMOVE:MessageBox.Show("5");break;case DBT_DEVICEQUERYREMOVEFAILED:MessageBox.Show("6");break;case DBT_DEVICEREMOVECOMPLETE:this.richTextBox1.AppendText("U盘已卸载");break;case DBT_DEVICEREMOVEPENDING:MessageBox.Show("7");break;case DBT_DEVICETYPESPECIFIC:MessageBox.Show("8");break;case DBT_DEVNODES_CHANGED:MessageBox.Show("9");break;case DBT_QUERYCHANGECONFIG:MessageBox.Show("10");break;case DBT_USERDEFINED:MessageBox.Show("11");break;default:break;}}}catch (Exception ex){MessageBox.Show(ex.Message);}base.WndProc(ref m);}}}
当我们插拔U盘时,Form1窗体会出现下面响应