应该要用hook吧,你的游戏开着,你做的监控程序肯定不能有焦点,这样只能通过全局钩子捕获键盘,如果能捕获键盘按键,捕获鼠标应该很简单,没做过这方面的,你搜搜如何捕获键盘,应该有源代码的。

解决方案 »

  1.   

    楼主看这里
    http://www.codeproject.com/csharp/globalhook.asp100分拿来
      

  2.   

    之前用的一些HOOK代码,看看吧。对你有什么帮助
            //添加变量    IntPtr _nextHookPtr; //记录Hook编号
            //添加变量
            [DllImport("User32.dll")]
            public static extern IntPtr FindWindow(string classname, string windowname);
            [DllImport("User32.dll")]
            public static extern IntPtr GetForegroundWindow();
            [DllImport("User32.dll")]
            public static extern long SetForegroundWindow(IntPtr hwnd);
            [DllImport("User32.dll")]
            public static extern long GetWindowText(IntPtr hwnd, string lpString, long cch);
            //private string windowtitle="";
            public IntPtr hwnd;
            //添加变量
            internal enum HookType //枚举,钩子的类型 
            {
                MsgFilter = -1,
                JournalRecord = 0,
                JournalPlayback = 1,
                Keyboard = 2,
                GetMessage = 3,
                CallWndProc = 4,
                CBT = 5,
                SysMsgFilter = 6,
                Mouse = 7,
                Hardware = 8,
                Debug = 9,
                Shell = 10,
                ForegroundIdle = 11,
                CallWndProcRet = 12,
                KeyboardLL = 13,
                MouseLL = 14,
            };        //中引入必须的API
            [DllImport("kernel32.dll")]
            static extern int GetCurrentThreadId();  //取得当前线程编号的API 
            [DllImport("User32.dll")]
            internal extern static void UnhookWindowsHookEx(IntPtr handle);//取消Hook的API
            [DllImport("User32.dll")]
            internal extern static IntPtr SetWindowsHookEx(int idHook, [MarshalAs(UnmanagedType.FunctionPtr)] HookProc lpfn, IntPtr hinstance, int threadID);
            //上面一个是设置Hook的API 
            [DllImport("User32.dll")]
            internal extern static IntPtr CallNextHookEx(IntPtr handle, int code, IntPtr wparam, IntPtr lparam);
            //上面取得下一个Hook的API    
            // 声明一个实现的委托
            internal delegate IntPtr HookProc(int code, IntPtr wparam, IntPtr lparam);
            //添加自己的Hook处理过程
            IntPtr MyHookProc(int code, IntPtr wparam, IntPtr lparam)
            {
                if (code < 0) return CallNextHookEx(_nextHookPtr, code, wparam, lparam); //返回,让后面的程序处理该消息 
                if (wparam.ToInt32() == 65 || wparam.ToInt32() == 91) //如果用户输入的是 b 
                {
                    textBox1.Text = "XXXX";
                    
                    return (IntPtr)1;
                    //直接返回了,该消息就处理结束了 
                }
                else
                {
                    return IntPtr.Zero;
                    //返回,让后面的程序处理该消息 
                }
            }
            //添加加入Hook链和从Hook链中取消的函数
            public void SetHook()
            {
                if (_nextHookPtr != IntPtr.Zero) //已经勾过了        
                    return;            HookProc myhookProc = new HookProc(MyHookProc); //声明一个自己的Hook实现函数的委托对象
                _nextHookPtr = SetWindowsHookEx((int)HookType.Keyboard, myhookProc, IntPtr.Zero, GetCurrentThreadId()); //加到Hook链中 
            }        public void UnHook()
            {
                if (_nextHookPtr != IntPtr.Zero)
                {
                    UnhookWindowsHookEx(_nextHookPtr);
                    //从Hook链中取消 
                    _nextHookPtr = IntPtr.Zero;
                }
            }
    你需要做的可能就是找窗口的句柄了