阿里妈妈,帮你实现网络赚钱梦,流量变成现金!
09-06
20

用C#做远程监控程序(三)--模拟键盘

给力技术 - 给您提供最新最全的Web资源     在上两篇中完成了查看客户端屏幕和鼠标控制功能,后来就一直没时间做剩下的键盘控制功能,今天终于是把它完成了,拖了差不多一个月。

    用C#做远程监控程序(一)
    用C#做远程监控程序(二)

    前面也说过,要实现键盘控制就是要在服务器端响应键盘事件,传送到客户端,客户端再模拟出来。
    为了避免鼠标和键盘的事件传送的时候发生冲突,需要在客户端再连接一个不同的端口,服务端启动的时候监听这两个端口。具
体的代码可以参考第一篇里所写的。
    定义一个键盘事件类型的枚举,主要就是按键按下和释放。
    
public enum KeyBoardType
    {
        Key_Down,
        Key_Up,
        Key_Press,
    }

    public enum KeyBoard
    {
        KEYEVENTF_KEYDOWN = 0x0001,
        KEYEVENTF_KEYUP = 0x0002
    }
    

    为了发送键代码,需要一个转换键盘事件的类,将键盘事件类型和键代码转为二进制以方便网络传输,形式和鼠标事件是类似的
,部分代码如下:
    

    public class KeyBoardHook
    {
        private Byte[] keyType;
        private Byte[] code;      

        public KeyBoardHook(KeyBoardType type, Keys keyCode)
        {
            keyType = BitConverter.GetBytes((int)type);
            code = BitConverter.GetBytes((int)keyCode);
        }

        public KeyBoardHook(Byte[] Content)
        {
            keyType = new byte[4];
            code = new byte[4];
            for (int i = 0; i < Content.Length; i++)
            {
                if (i >= 0 && i < 4)
                    keyType[i] = Content[i];
                if (i >= 4 && i < 8)
                    code[i - 4] = Content[i];
                if (i >= 8)
                    break;
            }
        }
    }
    

    写好了键盘事件的类,然后就要将键盘代码发送出去,要在KeyDown事件中处理。因为我用的是Picturebox显示客户端屏幕,就得触发Picturebox的KeyDown事件。在Picturebox的属性里是没有这个事件的,需要自己添加。在KeyDown事件里发送键盘代码。
    

    this.picScreen.KeyDown += new System.Windows.Forms.KeyEventHandler(picScreen_KeyDown);

    private void picScreen_KeyDown(object sender, KeyEventArgs e)
        {
            KeyBoardHook keyboard = new KeyBoardHook(KeyBoardType.Key_Down, e.KeyCode);
            e.SuppressKeyPress = true;
            nskb.Write(keyboard.ToBytes(), 0, 8);
        }
    

    然后再用同样的方法添加Picturebox的KeyUp事件,里面写上类似的代码,不同的是KeyBoardType为Key_Up。
    接下来就在客户端写接收的方法了,新开一个进程处理
    

    receive2 = new Thread(new ThreadStart(ReceiveKey));
    receive2.Start();
    

    要模拟键盘事件,先引入DLL
    

        [DllImport("user32.dll", CharSet = CharSet.Auto, EntryPoint = "keybd_event")]
        public static extern void keybd_event(
            byte bVk,
            byte bScan,
            int dwFlags,
            int dwExtraInfo
        );
    

    模拟键盘按下按键
    
    public static void KeyDown(System.Windows.Forms.Keys keyCode)
        {
            keybd_event((byte)keyCode, 0, (int)KeyBoard.KEYEVENTF_KEYDOWN, 0);
        }
    


    然后在函数里处理模拟键盘的事件
    

        public void ReceiveKey()
        {
            bool keepalive = true;
            while (keepalive)
            {
                byte[] recKeyboard = new byte[1024];
                nskb.Read(recKeyboard, 0, recKeyboard.Length);

                KeyBoardHook key = new KeyBoardHook(recKeyboard);
                switch (key.KeyType)
                {
                    case KeyBoardType.Key_Down:
                        KeyDown(key.Code);
                        break;
                    case KeyBoardType.Key_Up:
                        KeyUp(key.Code);
                        break;
                }
            }
        }
    

      到这里这个程序就已经基本上做完了,测试了一下,键盘模拟成功。整体的来看就是截图的发送的太慢,监控屏幕的时候有点卡
。写这些东西只是记录一下我学习C#网络编程的一些心得,写得有点乱。我的.NET交流群号:30954402。有兴趣的来交流一下学习C#.NET的一些心得。

[本日志由 老狼 于 2009-06-20 08:53 PM 编辑]
文章来自: 本站原创
引用通告: 查看所有引用 | 我要引用此文章
文章标签: c# TCP 键盘 远程
网摘收录:
相关日志:
发表评论
昵 称:
密 码: 游客发言不需要密码.
邮 箱: 支持Gravatar头像.
网 址: 输入网址便于回访.
内 容:
验证码:
选 项:
虽然发表评论不用注册,但是为了保护您的发言权,建议您注册帐号.