看到个软件蛮好玩的,叫做ULOGON,它可以让你只有插入了正确的U盘系统才能工作。其实我们也可以简单的用C#来实现这个功能,本文首先来讨论如何拦截系统的U盘插入消息。
以前写EFFECTIVEKEY软件的时候就要拦截系统键盘按键消息,但是那时是直接网上拉过来用了,没有仔细研究。今天期末考完了就好好分析下。
首先我们看下有哪几种拦截系统消息的方法:
Code
而上次写的软件用的就是第二种方法。因为习惯了,这次还是用这种方法吧。现在我们改写这个方法,我们必须知道U盘插入拔出的系统消息。这里我整理了下,告诉大家
DEVICECHANGE 0X219
DEVICEARRVIE 0X8000
DEVICEREMOVE 0X8004
我们拦截了DEVICECHANGE然后用tostring()方法:
msg=0x219 (WM_DEVICECHANGE) hwnd=0x50e54 wparam=0x8000 lparam=0x475e89c result=0x0
也就是说,当有驱动器加载时是发送WM_DEVICECHANGE消息,但是判断驱动器是加载还是卸载就要判断WPARAM字段是DEVICEARRIVE还是DEVICEMOVE,所以我们编写如下测试代码。
程序说明:
编译环境:VISTA+VS2005(C# WINDOWS FORM)
窗体设计:一个TEXTBOX(NAME: TextBox_Message)
protected override void WndProc(ref Message m)//监视Windows消息
{
const int WM_DEVICECHANGE = 0x219;
const int WM_DEVICEARRVIAL = 0x8000;//如果m.Msg的值为0x8000那么表示有U盘插入
const int WM_DEVICEMOVECOMPLETE=0x8004;
switch (m.Msg)
{
case WM_DEVICECHANGE:
{
ShowDeviceChanged("WM_DEVICECHANGE");//
if (m.WParam.ToInt32() == WM_DEVICEARRVIAL)
ShowDeviceChanged("WM_DEVICEARRVIAL");
else if (m.WParam.ToInt32() == WM_DEVICEMOVECOMPLETE)
ShowDeviceChanged("WM_DEVICEMOVECOMPLETE");
}
break;
}
base.WndProc(ref m); //将系统消息传递自父类的WndProc
}
private void BTN_Start_Click(object sender, EventArgs e)
{
}
public void ShowDeviceChanged(string message)
{
switch(message)
{
case "WM_DEVICECHANGE":
this.textBox_Message.Text += "Device Changed \r\n";
break;
case "WM_DEVICEMOVECOMPLETE":
this.textBox_Message.Text += "Device Moved\r\n";
break;
case "WM_DEVICEARRVIAL":
this.textBox_Message.Text += "Device Arrived\r\n";
break;
}
}
知道有U盘插入后我们可以判断插入的U盘中有没有我们需要的证书文件,如果没有就锁了电脑~呵呵。{
const int WM_DEVICECHANGE = 0x219;
const int WM_DEVICEARRVIAL = 0x8000;//如果m.Msg的值为0x8000那么表示有U盘插入
const int WM_DEVICEMOVECOMPLETE=0x8004;
switch (m.Msg)
{
case WM_DEVICECHANGE:
{
ShowDeviceChanged("WM_DEVICECHANGE");//
if (m.WParam.ToInt32() == WM_DEVICEARRVIAL)
ShowDeviceChanged("WM_DEVICEARRVIAL");
else if (m.WParam.ToInt32() == WM_DEVICEMOVECOMPLETE)
ShowDeviceChanged("WM_DEVICEMOVECOMPLETE");
}
break;
}
base.WndProc(ref m); //将系统消息传递自父类的WndProc
}
private void BTN_Start_Click(object sender, EventArgs e)
{
}
public void ShowDeviceChanged(string message)
{
switch(message)
{
case "WM_DEVICECHANGE":
this.textBox_Message.Text += "Device Changed \r\n";
break;
case "WM_DEVICEMOVECOMPLETE":
this.textBox_Message.Text += "Device Moved\r\n";
break;
case "WM_DEVICEARRVIAL":
this.textBox_Message.Text += "Device Arrived\r\n";
break;
}
}
思路就是这样,当然是十分简单的实现,如果真想写的好点可能还需要重写GINA.DLL,有兴趣的自己去MSDN查查资料吧。
最后祝大家元旦快乐~