C#拦截系统消息

Posted on 2008-01-10 12:34  Samson小天  阅读(6136)  评论(20编辑  收藏  举报

    看到个软件蛮好玩的,叫做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盘中有没有我们需要的证书文件,如果没有就锁了电脑~呵呵。
    思路就是这样,当然是十分简单的实现,如果真想写的好点可能还需要重写GINA.DLL,有兴趣的自己去MSDN查查资料吧。

最后祝大家元旦快乐~

Copyright © 2024 Samson小天
Powered by .NET 9.0 on Kubernetes