一、服务器端多线程Socket技术
  
用TcpListener进行侦听,接受客户端连接,有客户端连进来后开启处理线程处理数据,代码如下:
  
using System;
using System.Threading;
using System.Net.Sockets;
using System.Text;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            // 在8888端口侦听
            TcpListener serverSocket = );
            TcpClient clientSocket = default(TcpClient);
            ;

            serverSocket.Start();
            Console.WriteLine(" >> " + "Server Started");

            counter = ;
            while (true)
            {
                counter += ;
                // 接受客户端连接
                clientSocket = serverSocket.AcceptTcpClient();
                Console.WriteLine(" >> " + "Client No:" + Convert.ToString(counter) + " started!");
                // 启动客户端处理代码
                handleClinet client = new handleClinet();
                client.startClient(clientSocket, Convert.ToString(counter));
            }

            clientSocket.Close();
            serverSocket.Stop();
            Console.WriteLine(" >> " + "exit");
            Console.ReadLine();
        }
    }

    // 客户端连接处理类
    public class handleClinet
    {
        TcpClient clientSocket;
        string clNo;

        public void startClient(TcpClient inClientSocket, string clineNo)
        {
            this.clientSocket = inClientSocket;
            this.clNo = clineNo;
            // 开启处理线程
            Thread ctThread = new Thread(doChat);
            ctThread.Start();
        }

        private void doChat()
        {
            ;
            ];
            string dataFromClient = null;
            Byte[] sendBytes = null;
            string serverResponse = null;
            string rCount = null;
            requestCount = ;

            while ((true))
            {
                try
                {
                    requestCount = requestCount + ;

                    // 读取内容
                    NetworkStream networkStream = clientSocket.GetStream();
                    networkStream.Read(bytesFrom, , (int)clientSocket.ReceiveBufferSize);
                    dataFromClient = System.Text.Encoding.ASCII.GetString(bytesFrom);
                    dataFromClient = dataFromClient.Substring(, dataFromClient.IndexOf("$"));
                    Console.WriteLine(" >> " + "From client-" + clNo + dataFromClient);

                    rCount = Convert.ToString(requestCount);
                    serverResponse = "Server to clinet(" + clNo + ") " + rCount;
                    sendBytes = Encoding.ASCII.GetBytes(serverResponse);
                    networkStream.Write(sendBytes, , sendBytes.Length);
                    networkStream.Flush();
                    Console.WriteLine(" >> " + serverResponse);
                }
                catch (Exception ex)
                {
                    Console.WriteLine(" >> " + ex.ToString());
                }
            }
        }
    }
}
  
二、鼠标控制技术
  
鼠标的控制用到了 mouse_event 这个API函数,参考代码如下:
  
using System;
using System.Threading;
using System.Runtime.InteropServices;
using System.Windows.Forms;

namespace MouseControl
{
    class MouseControl
    {
        /// <summary>
        /// 鼠标控制参数
        /// </summary>
        const int MOUSEEVENTF_LEFTDOWN = 0x2;
        const int MOUSEEVENTF_LEFTUP = 0x4;
        const int MOUSEEVENTF_MIDDLEDOWN = 0x20;
        const int MOUSEEVENTF_MIDDLEUP = 0x40;
        const int MOUSEEVENTF_MOVE = 0x1;
        const int MOUSEEVENTF_ABSOLUTE = 0x8000;
        const int MOUSEEVENTF_RIGHTDOWN = 0x8;
        const int MOUSEEVENTF_RIGHTUP = 0x10;

        /// <summary>
        /// 鼠标的位置
        /// </summary>
        public struct PONITAPI
        {
            public int x, y;
        }

        [DllImport("user32.dll")]
        public static extern int GetCursorPos(ref PONITAPI p);

        [DllImport("user32.dll")]
        public static extern int SetCursorPos(int x, int y);

        [DllImport("user32.dll")]
        public static extern int mouse_event(int dwFlags, int dx, int dy, int cButtons, int dwExtraInfo);

        [STAThread]
        static void Main()
        {
            PONITAPI p = new PONITAPI();
            GetCursorPos(ref p);
            Console.WriteLine("鼠标现在的位置X:{0}, Y:{1}", p.x, p.y);
            Console.WriteLine("Sleep 1 sec...");
            Thread.Sleep();

            p.x = (new Random()).Next(Screen.PrimaryScreen.Bounds.Width);
            p.y = (new Random()).Next(Screen.PrimaryScreen.Bounds.Height);
            Console.WriteLine("把鼠标移动到X:{0}, Y:{1}", p.x, p.y);
            SetCursorPos(p.x, p.y);
            GetCursorPos(ref p);
            Console.WriteLine("鼠标现在的位置X:{0}, Y:{1}", p.x, p.y);
            Console.WriteLine("Sleep 1 sec...");
            Thread.Sleep();

            Console.WriteLine("在X:{0}, Y:{1} 按下鼠标左键", p.x, p.y);
            mouse_event(MOUSEEVENTF_LEFTDOWN, p.x, p.y, , );
            Console.WriteLine("Sleep 1 sec...");
            Thread.Sleep();

            Console.WriteLine("在X:{0}, Y:{1} 释放鼠标左键", p.x, p.y);
            mouse_event(MOUSEEVENTF_LEFTUP, p.x, p.y, , );
            Console.WriteLine("程序结束,按任意键退出....");
            Console.ReadKey();
        }
    }
}
  
三、键盘控制技术
  
键盘的控制用到了 keybd_event 这个API函数,参考代码段如下:
  
[DllImport("user32.dll", EntryPoint = "keybd_event")]
public static extern void keybd_event(
     byte bVk,
     byte bScan,
     int dwFlags,
     int dwExtraInfo
);

keybd_event((, , );//按下F11
keybd_event((, );   //弹起F11
  
四、运行程序
4.1
  
public static void RunProcess(string name, string command)
{
     Process myProcess = new Process();

     myProcess.StartInfo.FileName = name;
     myProcess.StartInfo.Arguments = command;
     myProcess.Start();
     return;
}
  
4.2 运行CMD并取得命令执行结果
  
public static string RunCmd(string command)//运行一个cmd命令
{
     Process p = new Process();

     //p.StartInfo.WorkingDirectory = "c:\\";    // 工作目录
     p.StartInfo.FileName = "cmd.exe";           // 程序名
     p.StartInfo.Arguments = "/c " + command;    // 执行参数
     p.StartInfo.UseShellExecute = false;        // 关闭Shell的使用
     p.StartInfo.RedirectStandardInput = true;   // 重定向标准输入
     p.StartInfo.RedirectStandardOutput = true;  // 重定向标准输出
     p.StartInfo.RedirectStandardError = true;   // 重定向错误输出
     p.StartInfo.CreateNoWindow = true;          // 设置不显示窗口

     p.Start();   //启动

     //p.StandardInput.WriteLine(command);       // 也可以用这种方式输入要执行的命令
     //p.StandardInput.WriteLine("exit");        // 不过要记得加上Exit,要不然下一行执行的时候会出错

     return p.StandardOutput.ReadToEnd();        // 从输出流取得命令执行结果
}
  
五、取得屏幕拷贝
  
public Image GetScreen( )
{
     //this.Hide();
     IntPtr dc1 = CreateDC("DISPLAY", null, null, (IntPtr)null);
     //创建显示器的DC
     Graphics g1 = Graphics.FromHdc(dc1);
     //由一个指定设备的句柄创建一个新的Graphics对象
     Bitmap MyImage = new Bitmap(Screen.PrimaryScreen.Bounds.Width, Screen.PrimaryScreen.Bounds.Height, g1);
     //根据屏幕大小创建一个与之相同大小的Bitmap对象
     Graphics g2 = Graphics.FromImage(MyImage);
     //获得屏幕的句柄
     IntPtr dc3 = g1.GetHdc();
     //获得位图的句柄
     IntPtr dc2 = g2.GetHdc();
     //把当前屏幕捕获到位图对象中
     BitBlt(dc2, , , Screen.PrimaryScreen.Bounds.Width, Screen.PrimaryScreen.Bounds.Height, dc3, , , );
     //把当前屏幕拷贝到位图中
     g1.ReleaseHdc(dc3);
     //释放屏幕句柄
     g2.ReleaseHdc(dc2);
     //释放位图句柄
     return MyImage;
     //this.Show();
}
  
取得屏幕拷贝的代码直接用了bitmap格式,性能不高,在实际使用中应该考虑进行压缩。

 

C# 实现远程控制软件的关键技术的更多相关文章

  1. 开源一款远程控制软件 —— pcshare

    这里开放一款远程控制软件的源码--pcshare,该软件分为被控制端和控制端.部分界面如下: 控制端通过寄生在被控制端的后台程序来实现控制,可以对被控制台进行文件管理.屏幕监控.键盘监控.监控管理.查 ...

  2. 解读:20大5G关键技术

    解读:20大5G关键技术 5G网络技术主要分为三类:核心网.回传和前传网络.无线接入网. 核心网 核心网关键技术主要包括:网络功能虚拟化(NFV).软件定义网络(SDN).网络切片和多接入边缘计算(M ...

  3. 小小知识点(二十七)20大5G关键技术

    5G网络技术主要分为三类:核心网.回传和前传网络.无线接入网. 核心网 核心网关键技术主要包括:网络功能虚拟化(NFV).软件定义网络(SDN).网络切片和多接入边缘计算(MEC). 1 网络功能虚拟 ...

  4. 5G关键技术评述

    业内重大事件: 张  平:无线通信领域专家,北京邮电大学教授,博士生导师,现任北京邮电大学无线新技术研究所(WTI)所长.泛网无线通信教育部重点实验室主任以及中德软件研究所副所长.张平教授是国家宽带无 ...

  5. 大型网站提速关键技术(页面静态化,memcached,MySql优化)(一)

    一:关键技术介绍: 衡量是否为大型网站的要素: A:PV值(page views 页面浏览量) 访问量大: 带来的问题:1:流量大 -->解决方案:增加带宽,优化程序(视频和图片较浪费带宽,尽量 ...

  6. Java进阶(三)多线程开发关键技术

    原创文章,同步发自作者个人博客,转载请务必以超链接形式在文章开头处注明出处http://www.jasongj.com/java/multi_thread/. sleep和wait到底什么区别 其实这 ...

  7. (1)RGB-D SLAM系列- 工具篇(硬件+关键技术)

    /*************************************************************************************************** ...

  8. TeamViewer12.0.71503(远程控制软件)精简版单文件企业版介绍

    TeamViewer 是一款能在任何防火墙和 NAT 代理的后台用于远程控制,桌面共享和文件传输的简单且快速的解决方案.为了连接到另一台计算机,只需要在两台计算机上同时运行 TeamViewer 即可 ...

  9. 操作PDF文件的关键技术点

    一个PDF文档从大到小可以分成如下几个要素:文档.章节.小节.段落.表格.列表. com.lowagie.text.Document表示PDF文档.必须为它创建一个PDF写入器,即com.lowagi ...

随机推荐

  1. Codeforces Round #349 (Div. 2) D. World Tour (最短路)

    题目链接:http://codeforces.com/contest/667/problem/D 给你一个有向图,dis[i][j]表示i到j的最短路,让你求dis[u][i] + dis[i][j] ...

  2. UI进阶 数据加密

    一.数据安全 在互联网发展趋势迅猛的今天,数据安全的重要性日趋凸显.也成为我们必须了解的互联网知识.在移动互联网浪潮下,用户的资金安全.企业的信息安全都是我们实际开发中必须考虑的内容.

  3. matlab和FPGA中无符号数和有符号数的转化(转)

    在FPGA 设计过程中经常会遇到关于数表示之间的转化问题,最常见的是无符号数和有符号数之间的转化问题.(1)在FPGA设计过程中,能够很直接的看出数字的位宽,但经常以无符号数的形式输出,在后继的处理中 ...

  4. ORACLE R12 MOAC

    MOAC简介 MOAC(Multi-Org Access Control)为多组织访问控制,是Oracle EBS R12的重要新功能.它可以实现在一个Responsibility下对多个OU(Ope ...

  5. hibernate二级缓存ehcache

    与Session相对的是,SessionFactory也提供了相应的缓存机制.SessionFactory缓存可以依据功能和目的的不同而划分为内置缓存和外置缓存. SessionFactory的内置缓 ...

  6. Ubuntu的力量何在?

    = 怎样正确评价Ubuntu,这不是一个简单问题.Ubuntu的 力量何在?它的意义何在?这都是须要认真研究的. 实际上,Uuntu 14.04 LTS公布之后,并没有引起预期的热烈反响.这是什么原因 ...

  7. git使用具体介绍

    1. Git概念  1.1. Git库中由三部分组成         Git 仓库就是那个.git 文件夹,当中存放的是我们所提交的文档索引内容,Git 可基于文档索引内容对其所管理的文档进行内容追踪 ...

  8. 在WCF中不使用svc文件直接使用cs文件

    在 配置中有个节点可以实现 此功能 <serviceHostingEnvironment multipleSiteBindingsEnabled="true" > &l ...

  9. mysql 找不到或无法加载已注册的 .Net Framework Data Provider

    需要安装 mysql-connector-net-6.7.4.msi 在C盘安装mysql的位置找到三个DLL,复制到Bin文件夹下 在C:\Windows\Microsoft.NET\Framewo ...

  10. MVC4 EF6 MYSQL

    在MVC的框架下连接mysql数据库 将EF框架升级到EF6 将NEW JSON升级到与之相匹配的版本 然后进行相应的配置就可以了