我参考网上的资料做了一个全局钩子,我想使用WH_CBT来捕获其它应用程序关闭的消息。如代码:hookFlag = SetWindowsHookEx(WH_CBT, m_HookDelegate, Marshal.GetHINSTANCE(Assembly.GetExecutingAssembly().GetModules()[0]),0);钩子处理函数:
 private int HookProc(int nCode, int wParam, IntPtr lParam)
        {
            if (nCode == HCBT_ACTIVATE)
            {
                //这里。。永远都不会执行
            }
            return CallNextHookEx(hookFlag, nCode, wParam, lParam);
        }
现在的问题是,在安装钩子后,感觉好像监控不到任何消息,我想监控指定的应用程序,也不行,如代码:
           Process process = new Process();
            process.StartInfo.FileName = "notepad.exe";
            process.StartInfo.CreateNoWindow = true;
            process.Start();
            kk = (int)process.MainWindowHandle;
.....安装钩子时,
hookFlag = SetWindowsHookEx(WH_CBT, m_HookDelegate, Marshal.GetHINSTANCE(Assembly.GetExecutingAssembly().GetModules()[0]),kk);
这样,记事本程序是打开了,但无论其状态如何变化(如,激活)也收不到它任何消息.请问,要达到我的目的,该用什么类型的钩子呢?在下对钩子还不熟悉,请高手指点一下。谢谢

解决方案 »

  1.   

    Net程序无法直接SetWindowsHookEx 全局钩子(除鼠标键盘钩子外), 你必须挂接在win32的dll中. .
      

  2.   

    把后面一句往前提了下 忘了把点剪切.造成 .Net成了Net 后面跑出两个句点 哈哈
      

  3.   

    钩子必须以dll形式出现,网上有很多例子,首先封装成dll,然后在C#中进行调用。www.codeproject.com上面有例子
      

  4.   

    WH_CBT钩子 不能在.net的委托中实现,(看看MSDN的说明)
    除非 用委托指向一个自然DLL的导出函数,也就是执行过程在DLL里面,在c#只是获得DLL执行的结果