我用EnumWindows得到了qq每个聊天窗口的句柄,然后得到了他们的进程和进程名,想为每个窗口设置键盘钩子,但是SetWindowsHookEx(int idHook, HookProc lpfn, IntPtr hInstance, int threadId)的参数老是设置错误,请问需要调用全局dll吗?假设句柄参数为:IntPtr hwnd 进程为:int id  

解决方案 »

  1.   

    QQ也有钩子,始终比外部的钩子后下,它具有优先权,你的钩子得到的东西是QQ的钩子修改过的,不是真的。
      

  2.   

           public  List<WindowInfo> GetAllDesktopWindows()
            {
                List<WindowInfo> wndList = new List<WindowInfo>();            //enum all desktop windows
                EnumWindows(delegate(IntPtr hWnd, int lParam)
                {
                    WindowInfo wnd = new WindowInfo();
                    StringBuilder sb = new StringBuilder(256);
                    //get hwnd
                    wnd.hWnd = hWnd;
                    //get window name
                    GetWindowTextW(hWnd, sb, sb.Capacity);
                    wnd.szWindowName = sb.ToString();
                    //get window class
                    GetClassNameW(hWnd, sb, sb.Capacity);
                    wnd.szClassName = sb.ToString();
                    //add it into list
                    wndList.Add(wnd);
                    return true;
                }, 0);            //return wndList.ToArray();
                return wndList;
            }
           void kaishi()
            {
                int i = 0;
                List<WindowInfo> wndList1 = new List<WindowInfo>();
                wndList1 = GetAllDesktopWindows();
                int id=0;
                foreach (WindowInfo one in wndList1)
                {
                    i = 0;
                    int pid_zhuandao = 0;
                    string s1 = "";
                    string s2 = one.szClassName.ToString();
                    GetWindowThreadProcessId(one.hWnd, out pid_zhuandao);
                    foreach (Process thisproc in System.Diagnostics.Process.GetProcesses())
                    {
                        if (thisproc.Id == pid_zhuandao)
                        {
                            s1 = thisproc.ProcessName.ToString();
                        }
                    }
                   if ((one.szWindowName.ToString().IndexOf("交谈") > -1) && (s1 == "QQ"))
                   {
                        i = 1;
                        Console.Write(one.hWnd.ToString() + "**** ");
                        Console.Write(s2 + "*****");
                        Console.Write(one.szWindowName.ToString() + "****  ");
                        Console.Write(pid_zhuandao.ToString() + "  *****");
                        Console.WriteLine(s1); ;
                        Console.WriteLine("正在监视   " + one.szWindowName.ToString() + "     窗口");
                        id = pid_zhuandao;            
                   }
                   if(i==1)
                   HookStart(one.hWnd, id);
                }
                Console.ReadKey();
            }
          public void HookStart(IntPtr one, int two)
            {
                if (hKeyboardHook == 0)
                {
                    // 创建HookProc实例 
                    KeyboardHookProcedure = new HookProc(KeyboardHookProc);
                    // 设置线程钩子 
                    hKeyboardHook = SetWindowsHookEx(2, KeyboardHookProcedure, one,
                   two);
                    //textBox1.SelectionStart = textBox1.Text.Length;
                    // 如果设置钩子失败 
                    if (hKeyboardHook == 0)
                    {
                        Console.WriteLine("创建失败");
                        HookStop();
                        //throw new Exception("SetWindowsHookEx failed.");
                    }
                }        }
      

  3.   

    仔细看了下,参数都很正确,只是QQ2008(还是2009?)以后,有反键盘钩子的功能记得印象最深的是,我帮客户装了2009,结果他的手写板写东西上不了QQ(其他程序都可以写出)叫了半天,结果又装回2007给他。如果有疑问,可以试钩下记事本不就明白参数是否正确了?
      

  4.   

    你还不如动态开启它的聊天记录功能,然后读它的xml