using System;
using System.Collections.Generic;
using System.Text;
using System.Runtime.InteropServices;

namespace Key


{
class Hook

{
public delegate int HookKeyProc(int code, IntPtr wParam, IntPtr lParam);
private HookKeyProc hookKeyDeleg;

private static int hHookKey = 0;
public Hook()

{ }

public methods#region public methods
//安装钩子
public void Start()

{
if (hHookKey != 0)

{
//Unhook the previouse one
this.Stop();
}
hookKeyDeleg = new HookKeyProc(HookKeyProcedure);
hHookKey = SetWindowsHookEx(WH_KEYBOARD_LL, hookKeyDeleg, GetModuleHandle(null), 0);
if (hHookKey == 0)

{
throw new SystemException("Failed acquiring of the hook.");
}
}
//拆除钩子
public void Stop()

{
UnhookWindowsHookEx(hHookKey);
}

#endregion


protected and private methods#region protected and private methods
private int HookKeyProcedure(int code, IntPtr wParam, IntPtr lParam)

{

KBDLLHOOKSTRUCT hookStruct = (KBDLLHOOKSTRUCT)Marshal.PtrToStructure(lParam, typeof(KBDLLHOOKSTRUCT));
if (code < 0)

{
return CallNextHookEx(hookKeyDeleg, code, wParam, lParam);
}
if (hookStruct.vkCode == 0x72)//拨打电话键

{
//自己的处理
//处理完之后一定要返回-1
return -1
}

// 没处理的键的消息往下传递
return CallNextHookEx(hookKeyDeleg, code, wParam, lParam);

}

#endregion


P/Invoke declarations#region P/Invoke declarations

[DllImport("coredll.dll")]
private static extern int SetWindowsHookEx(int type, HookKeyProc HookKeyProc, IntPtr hInstance, int m);

[DllImport("coredll.dll")]
private static extern IntPtr GetModuleHandle(string mod);

[DllImport("coredll.dll")]
private static extern int CallNextHookEx(HookKeyProc hhk, int nCode, IntPtr wParam, IntPtr lParam);

[DllImport("coredll.dll")]
private static extern int GetCurrentThreadId();

[DllImport("coredll.dll", SetLastError = true)]
private static extern int UnhookWindowsHookEx(int idHook);

private struct KBDLLHOOKSTRUCT

{
public int vkCode;
public int scanCode;
public int flags;
public int time;
public IntPtr dwExtraInfo;
}

const int WH_KEYBOARD_LL = 20;

public class KeyBoardInfo

{
public int vkCode;
public int scanCode;
public int flags;
public int time;

}

#endregion

}
}

在
应用时,可以将这个类添加到自己的
项目中,在要用的地方直接调用,方法如下:
Hook hk=new Hook();
hk.Start();
hk.Stop();
http://www.devdiv.net/viewthread.php?tid=15006&extra=page%3D1%26amp%3Bfilter%3Dtype%26amp%3Btypeid%3D25
posted on
2009-09-22 09:21 老虎爱吃鱼 阅读(106) 评论()
编辑 收藏