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

解决方案 »

  1.   

    相关贴http://expert.csdn.net/Expert/topic/1835/1835749.xml?temp=.4851648.
    谢谢帮忙啦。
      

  2.   

    大哥,翻译问题很多啊,能不能准确点啊,谢谢啦。
    比如:1.C#中的api定义
    2.hnextHookproc = SetWindowsHookEx(WH_KEYBOARD, delegate(GAIS);
                    MyKBHFunc, App.hInstance, 0);等等
      

  3.   

    public class Win32Hook
    {
    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函数和回调函数都翻译好了。你自己根据需要改改。如果解决不来你的问题,不如说说你要的功能,重新写一个也不麻烦。
      

  4.   

    TheAres(班门斧)到底是高手啊!
    这个程序是想实现,键盘按了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.
    谢谢关注,帮忙。
      

  5.   

    对了RegisterHotKey,UnregisterHotKey使用中,注册两个以上热键弄啊?