1.
[DllImport("GAIS", SetLastError=true)] static extern long SetWindowsHookEx Lib "user32" Alias "SetWindowsHookExA" ( long idHook, long lpfn, long hmod, long dwThreadId) [DllImport("GAIS", SetLastError=true)] static extern long UnHookWindowsHookEx Lib "user32" ( long hHook) [DllImport("GAIS", SetLastError=true)] static extern long CallNextHookEx Lib "user32" ( long hHook, long ncode, long wParam, Any lParam) 2.
public long hnextHookproc;public const WH_KEYBOARD = 2 ‘这个是表明Hook的种类是键盘Hookpublic const PM_KEY_SPACE = &H20 ‘空格键3.
public void UnHookKBD() ‘解键盘HOOK函数 { if ( hnextHookproc != 0 ) { UnHookWindowsHookEx hnextHookproc; hnextHookproc = 0; }} public EnableKBDHook() ‘设置键盘HOOK { if ( hnextHookproc != 0 ) { Exit Function; } hnextHookproc = SetWindowsHookEx(WH_KEYBOARD, delegate(GAIS);
MyKBHFunc, App.hInstance, 0); if ( hnextHookproc != 0 ) { EnableKBDHook = hnextHookproc; }} public MyKBHFunc( long iCode, {
long wParam, long long lParam); MyKBHFunc = 0; if ( iCode < 0 ) { MyKBHFunc = CallNextHookEx(hnextHookproc, iCode, wParam, lParam); Exit Function; }if ( wParam = PM_KEY_SPACE ) { ////偵測 有沒有按到空格鍵 MyKBHFunc = 1; ‘加入自己的代码,用于表明响应; form1.text1.text=”Hook成功!”; }}4.在Form中的代码很简单:;private void Form_Load() { Call EnableKBDHook;} private void Form_Unload(int Cancel) { Call UnHookKBD;}
[DllImport("GAIS", SetLastError=true)] static extern long SetWindowsHookEx Lib "user32" Alias "SetWindowsHookExA" ( long idHook, long lpfn, long hmod, long dwThreadId) [DllImport("GAIS", SetLastError=true)] static extern long UnHookWindowsHookEx Lib "user32" ( long hHook) [DllImport("GAIS", SetLastError=true)] static extern long CallNextHookEx Lib "user32" ( long hHook, long ncode, long wParam, Any lParam) 2.
public long hnextHookproc;public const WH_KEYBOARD = 2 ‘这个是表明Hook的种类是键盘Hookpublic const PM_KEY_SPACE = &H20 ‘空格键3.
public void UnHookKBD() ‘解键盘HOOK函数 { if ( hnextHookproc != 0 ) { UnHookWindowsHookEx hnextHookproc; hnextHookproc = 0; }} public EnableKBDHook() ‘设置键盘HOOK { if ( hnextHookproc != 0 ) { Exit Function; } hnextHookproc = SetWindowsHookEx(WH_KEYBOARD, delegate(GAIS);
MyKBHFunc, App.hInstance, 0); if ( hnextHookproc != 0 ) { EnableKBDHook = hnextHookproc; }} public MyKBHFunc( long iCode, {
long wParam, long long lParam); MyKBHFunc = 0; if ( iCode < 0 ) { MyKBHFunc = CallNextHookEx(hnextHookproc, iCode, wParam, lParam); Exit Function; }if ( wParam = PM_KEY_SPACE ) { ////偵測 有沒有按到空格鍵 MyKBHFunc = 1; ‘加入自己的代码,用于表明响应; form1.text1.text=”Hook成功!”; }}4.在Form中的代码很简单:;private void Form_Load() { Call EnableKBDHook;} private void Form_Unload(int Cancel) { Call UnHookKBD;}
谢谢帮忙啦。
比如:1.C#中的api定义
2.hnextHookproc = SetWindowsHookEx(WH_KEYBOARD, delegate(GAIS);
MyKBHFunc, App.hInstance, 0);等等
{
public int hnextHookproc;
public const int WH_KEYBOARD = 2; // ‘这个是表明Hook的种类是键盘Hook
public const int PM_KEY_SPACE = 0x20;//空格键 [DllImport( "user32",CharSet=CharSet.Auto,CallingConvention=CallingConvention.StdCall)]
public static extern int SetWindowsHookEx(
int idHook,
HOOKPROC lpfn,
int hmod,
int dwThreadId); [DllImport( "user32",CharSet=CharSet.Auto,CallingConvention=CallingConvention.StdCall)]
public static extern int UnHookWindowsHookEx(int hHook); [DllImport("user32", CallingConvention = CallingConvention.StdCall)]
public static extern int CallNextHookEx( int hHook ,
int nCode,
int wParam,
int lParam ); public delegate int HOOKPROC(int nCode, int wParam, int lParam);
public void UnHookKBD()
{
if (hnextHookproc != 0)
{
UnHookWindowsHookEx(hnextHookproc);
hnextHookproc = 0;
}
} public void EnableKBDHook()
{
if (hnextHookproc != 0)
return; hnextHookproc = SetWindowsHookEx(WH_KEYBOARD,
new HOOKPROC(this.MyKeyboardProc),
0,
0); }
public int MyKeyboardProc(int iCode, int wParam, int lParam)
{
if( iCode < 0 )
{
CallNextHookEx(hnextHookproc,iCode,wParam,lParam);
return 0;
} if(wParam == PM_KEY_SPACE)
{
return 1;
} return 0; }
}
}大体给你翻译了一下,到后来发现这段VB.Net的代码好像不全。App.hInstance就不知道是什么意思。几个API函数和回调函数都翻译好了。你自己根据需要改改。如果解决不来你的问题,不如说说你要的功能,重新写一个也不麻烦。
这个程序是想实现,键盘按了space键后form中的文本框显示"Hook成功!"
我现在已经修改成功了,代码如下:
//声明一个钩子函数代理:
public delegate IntPtr HookProc(int nCode, IntPtr wParam, IntPtr lParam); //声明API函数:
[DllImport("user32.dll", CharSet=CharSet.Auto)]
public static extern IntPtr SetWindowsHookEx(int hookid, HookProc pfnhook, IntPtr hinst, int threadid);
[DllImport("user32.dll", CharSet=CharSet.Auto, ExactSpelling=true)]
public static extern bool UnhookWindowsHookEx(IntPtr hhook);
[DllImport("user32.dll", CharSet=CharSet.Auto, ExactSpelling=true)]
public static extern IntPtr CallNextHookEx(IntPtr hhook, int code, IntPtr wparam, IntPtr lparam); [DllImport("kernel32.dll", ExactSpelling=true, CharSet=CharSet.Auto)]
public static extern int GetCurrentThreadId();
private IntPtr iHookHandle=IntPtr.Zero;
private GCHandle _hookProcHandle;
//这个是表明Hook的种类是键盘Hook
private const int WH_KEYBOARD = 2;
//空格键
private const int PM_KEY_SPACE =0x20;//解键盘HOOK函数
public void UnHookKBD()
{
if (iHookHandle!=IntPtr.Zero)
UnhookWindowsHookEx(iHookHandle);
_hookProcHandle.Free();
iHookHandle = IntPtr.Zero; }
//设置键盘HOOK
public void EnableKBDHook()
{
HookProc hookProc = new HookProc(MyKBHFunc);
_hookProcHandle = GCHandle.Alloc(hookProc);
iHookHandle = SetWindowsHookEx(WH_KEYBOARD, hookProc, IntPtr.Zero, GetCurrentThreadId());
if (iHookHandle == IntPtr.Zero) throw new System.Exception("没有足够权限安装钩子!");
} public IntPtr MyKBHFunc(int iCode , IntPtr wParam,IntPtr lParam)
{
if ((int)wParam ==PM_KEY_SPACE )
{ menuItem4.PerformClick ();
this.textBox1.Text="Hook成功!";}
return CallNextHookEx(iHookHandle, iCode, wParam, lParam); }//但这段代码只能当窗口为当前窗口时可以用,如果不是当前窗口哪能不能用HOOK的方法实现了呢?
//用注册快键,参考 RegisterHotKey,UnregisterHotKey是可以的。我希望是用HOOK.
谢谢关注,帮忙。