標籤: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#攔截系統訊息