我用了一个钩子实现了对窗体里面的作用啊,但是不能够对整个计算机起作用啊,例如禁止输入'q',可以在窗体里面禁止这个键盘输入,但是在桌面上打开随便个文件,都还是可以写如'q'的,为什么啊?要怎么做啊!是因为系统钩子,和进程钩子什么的问题吗???
我的程序在bolg里面
大家帮忙啊!!
下面是主要部分。怎么改进啊??
++++++++++++++++++++++++++++++++++++++++++++
public void SetHook()
{
if( _nextHookPtr != IntPtr.Zero ) //已经勾过了
return;
HookProc myhookProc = new HookProc(MyHookProc); //声明一个自己的Hook实现函数的委托对象
_nextHookPtr = SetWindowsHookEx((int)HookType.Keyboard, myhookProc , IntPtr.Zero ,  GetCurrentThreadId()); //加到Hook链中
}==============================================================================
IntPtr MyHookProc(int code, IntPtr wparam, IntPtr lparam)
{   
if( code < 0 ) return CallNextHookEx(_nextHookPtr,code, wparam, lparam); //返回,让后面的程序处理该消息            
if( wparam.ToInt32() == 98  ) //如果用户输入的是 b 
{
this.textBox1.Text+="a";
return   (IntPtr) 1; //直接返回了,该消息就处理结束了
}
else if(wparam.ToInt32() == 66)
         {
this.textBox1.Text+="A";
return   (IntPtr) 1; //直接返回了,该消息就处理结束了
}
else
{
return IntPtr.Zero; //返回,让后面的程序处理该消息
}
}

解决方案 »

  1.   

    函数原型如下
    HHOOK SetWindowsHookEx(          int idHook,
        HOOKPROC lpfn,
        HINSTANCE hMod,
        DWORD dwThreadId
    );你的第三个参数给的不对,第三个参数应该是hook处理函数所在的module地址,因此不是IntPtr.Zero。你参看别人的例子进行改写
    http://www.codeproject.com/cs/system/CSLLKeyboard.asp
    http://www.codeproject.com/csharp/globalhook.asp
      

  2.   

    1。做成dll
    2。把SetWindowsHookEx得第四个参数置为NULL,变成全局钩子。你现在只勾自己得进程。