C#類 勾子 ,以下代碼能運行,能呼叫,不報錯,就是不起作用,求解(送上我的全部積分)
class myHook
{
private IntPtr pKeyboardHook = IntPtr.Zero;//鍵盤鉤子句柄
//鉤子委托宣告
public delegate int HookProc(int nCode, Int32 wParam, IntPtr lParam);
private HookProc KeyboardHookProcedure;//鍵盤鉤子委托實體,不能省略變數
public const int idHook = 13;//底層鍵盤鉤子
//安裝鉤子
[DllImport("user32.dll", CallingConvention = CallingConvention.StdCall)]
public static extern IntPtr SetWindowsHookEx(int idHook, HookProc lpfn, IntPtr pInstance, int threadID);
//卸載鉤子
[DllImport("user32.dll", CallingConvention = CallingConvention.StdCall)]
public static extern bool UnhookWindowsHookEx(IntPtr pHookHandle);
//鍵盤鉤子處理函式
private int KeyboardHookProc(int nCode, Int32 wParam, IntPtr lParam)
{
KeyMSG m = (KeyMSG)Marshal.PtrToStructure(lParam, typeof(KeyMSG));//鍵盤訊息處理
if (pKeyboardHook != IntPtr.Zero)//判斷鉤子句柄是否為空
{
switch (((Keys)m.vkCode))//判斷按鍵
{
case Keys.LWin://鍵盤左側的Win鍵
case Keys.RWin://鍵盤右側的Win鍵
case Keys.Delete://Delete鍵
case Keys.Alt://Alt鍵
case Keys.Escape: //Esc鍵
case Keys.F4: //F4鍵
case Keys.Control://Ctrl鍵
case Keys.Tab://Tab鍵
return 1;//不執行任何操作
}
}
return 0;
}
//安裝鉤子方法
public bool InsertHook()
{
IntPtr pIn = (IntPtr)4194304;//將4194304轉換為句柄
if (this.pKeyboardHook == IntPtr.Zero)//不存在鉤子時
{
//創建鉤子
this.KeyboardHookProcedure = new HookProc(KeyboardHookProc);
//使用SetWindowsHookEx函式安裝鉤子
this.pKeyboardHook = SetWindowsHookEx(idHook, KeyboardHookProcedure, pIn, 0);
if (this.pKeyboardHook == IntPtr.Zero)//如果安裝鉤子失敗
{
this.UnInsertHook();//卸載鉤子
return false;
}
}
return true;
}
//卸載鉤子方法
public bool UnInsertHook()
{
bool result = true;
if (this.pKeyboardHook != IntPtr.Zero)//如果存在鉤子
{
//使用UnhookWindowsHookEx函式卸載鉤子
result = (UnhookWindowsHookEx(this.pKeyboardHook) && result);
this.pKeyboardHook = IntPtr.Zero;//清空指標
}
return result;
}
//鍵盤訊息處理結構
[StructLayout(LayoutKind.Sequential)]
public struct KeyMSG
{
public int vkCode;//鍵盤按鍵
}
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/185164.html
標籤:C#
