C#攔截系統訊息

來源:互聯網
上載者:User

標籤:style   blog   http   io   os   ar   for   sp   div   

首先我們看下有哪幾種攔截系統訊息的方法:


 
//一、截取系統訊息
//方法一:
//添加監視訊息
private void Form_Load(object sender, System.EventArgs e)
{
  Application.AddMessageFilter(this);
}
//撤消訊息監視
private void Form_Closing(object sender, System.ComponentModel.CancelEventArgs e)
{
  Application.RemoveMessageFilter(this);
}
//截取訊息,進行處理
public bool PreFilterMessage(ref System.Windows.Forms.Message m)
{
  switch(m.Msg )
  {
  case 513:        //攔截左鍵單擊事件 
  MessageBox.Show("哈哈,你點擊了左鍵被攔截!");
  return true;    //返回true則訊息被裁取,系統不再處理
  case 516:        //攔截左鍵單擊事件 
  MessageBox.Show("哈哈,你點擊了右鍵被攔截!");
  return true;    //返回true則訊息被裁取,系統不再處理
  default:
  return false;    //返回false則訊息未被裁取,系統會處理
  }

//方法二: 
//截取訊息,進行處理 
protected override void WndProc(ref Message m) 
{
  switch(m.Msg)
  {
  case 17:
  MessageBox.Show("哈哈,你不能關閉電腦!");
  m.Result=(IntPtr)0;
  break;
  case 513:
  MessageBox.Show("哈哈,你不能點擊左鍵!"); 
  m.Result=(IntPtr)0;
  break;
  case 516:
  MessageBox.Show("哈哈,你不能點擊右鍵!"); 
  m.Result=(IntPtr)0;
  break;
  default:
  base.WndProc(ref m);
  break;
 }

 

    而上次寫的軟體用的就是第二種方法。因為習慣了,這次還是用這種方法吧。
    現在我們改寫這個方法,我們必須知道隨身碟插入拔出的系統訊息。
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,所以我們編寫如下測試代碼。
    程式說明:

        protected override void WndProc(ref Message m)//監視Windows訊息
        {
            const int WM_DEVICECHANGE = 0x219;
            const int WM_DEVICEARRVIAL   =   0x8000;//如果m.Msg的值為0x8000那麼表示有隨身碟插入
            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
        }

        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;
           }
       } 

C#攔截系統訊息

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.