发现c#调用api不能用啊!SetWindowsHookEx总是返回0。高手请帮忙看看!
    //定义委托(钩子函数,用于回调)
        public delegate int HookProc(int code, int wParam, IntPtr lParam);
        //安装钩子的函数
        //[DllImport("User32.dll",CharSet = CharSet.Auto)]
        [DllImport("user32.dll", CharSet = CharSet.Auto,
            CallingConvention = CallingConvention.StdCall, SetLastError = true)]
        private static extern int SetWindowsHookEx(int idHook, HookProc lpfn, IntPtr hMod, int dwThreadId);
        //public static extern int SetWindowsHookEx(int type, HookProc hook, IntPtr instance, IntPtr threadID);
        //调用下一个钩子的函数
        [DllImport("User32.dll", CharSet = CharSet.Auto)]
        public static extern int CallNextHookEx(IntPtr hookHandle, int code, int wParam, IntPtr lParam);
        //卸载钩子
        [DllImport("User32.dll", CharSet = CharSet.Auto)]
        public static extern bool UnhookWindowsHookEx(IntPtr hookHandle);        [DllImport("user32.dll")]
        static extern IntPtr FindWindow(string s, string WindowCaption);        //获取窗体线程ID
        // [DllImport("User32.dll",CharSet = CharSet.Auto)]
        //public static extern int GetWindowThreadProcessId(IntPtr hwnd, IntPtr ID);
        [DllImport("User32.dll", CharSet = CharSet.Auto)]
        public static extern int GetWindowThreadProcessId(IntPtr hwnd, int processid);        [DllImport("user32.dll")]
        private static extern IntPtr GetForegroundWindow();        [DllImport("kernel32")]
        public static extern int GetCurrentThreadId();
        private HookProc hookProc;
        private IntPtr hookHandle;
 string proname = "notepad";
            pro = System.Diagnostics.Process.GetProcessesByName(proname);
            //pro1 = System.Diagnostics.Process.GetCurrentProcess();
            if (pro[0] == null)
            {
                return;
            }
            this.hookHandle = pro[0].MainWindowHandle;//这里不管是用Handle属性还是MainWindowHandle都不行!
            
            //hookHandle = FindWindow(null, pro[0].MainWindowTitle);
            ProcId = pro[0].Id;
          //  this.Text = "Game   name:" + pro[0].ProcessName + "ID" + pro[0].Id;
            this.hookProc = new HookProc(myhookproc);            StartHook();//此处主要用来让窗口置于最前(SetWindowPos(this.Handle,-1,0,0,0,0,0x4000|0x0001|0x0002);)     
        [System.Runtime.InteropServices.DllImport("user32.dll")]
        public static extern bool SetWindowPos(IntPtr hWnd,
        int hWndInsertAfter,
        int X,
        int Y,
        int cx,
        int cy,
        int uFlags
        );        //开始拦截
        private void StartHook()
        {
            //idHook 钩子类型,即确定钩子监听何种消息,上面的代码中设为2,即监听键盘消息并且是线程钩子,如果是全局钩子监听键盘消息应设为13,线程钩子监听鼠标消息设为7,全局钩子监听鼠标消息设为14。
            //安装钩子,拦截系统向Form2发出的消息
            //hookHandle = FindWindow(null, pro[0].MainWindowTitle);
            //hookHandle = GetForegroundWindow(); ;
            bool setPos = SetWindowPos(hookHandle, 0, 0, 0, 0, 0, 0x4000 | 0x0001 | 0x0002);
            int threadid = GetWindowThreadProcessId(this.hookHandle, 0);
            int t = SetWindowsHookEx(2, hookProc, IntPtr.Zero, threadid);
           // System.Threading.Thread.Sleep(3000);
            //int t = SetWindowsHookEx(2, hookProc, IntPtr.Zero, ProcId);
            MessageBox.Show("hook" + t.ToString() + "zzzz" + threadid.ToString());
            //return (this.hookHandle != null);
        }