作者:faaronzheng 转载请注明出处!
最近使用到c#调用远程控制软件实现远程控制,发现网上并没有现成可用的解决方案。
这里给出我的解决办法~

序:
先简单介绍一下常见的几种远程控制软件的优缺点:
AnyDesk(AD) 优点:体积较小,使用方便 。缺点:不稳定。
TeamView(TM) 优点:体积较大,但是功能更强大也更稳定。 缺点:软件本身收费,虽然可以免费使用但是有很多弹窗,并且由于服务器在国外的原因听说某些地方省份好像不能很好使用。
ultravnc(VNC)优点:三款远程控制软件中连接速度最快的,使用也很方便,体积很小。 缺点:自身不可以内网穿透。

解决方案
假设A想远程控制B的电脑,那么简单说来需要两个步骤:一:A需要获取B的远程控制软件ID和密码(密码既可以是远程控制软件随机生成的(仅TM),也可以获取B提前手动设置的一个固定密码(全部适用))。二:A使用ID和密码通过相应的远程控制软件连接B的电脑。

ID和密码的获取:对于ID,TM和AD可以采用Windows API来获取软件上的ID,VNC需要使用IP+端口的方式连接。除此之外,TM也可以通过注册表来获取ID。
对于TM的随机密码,也采用Windows API来获取。但是对于手动设置的固定密码则要去分析一下各个软件的配置文件之类的了(总是以某种方式保存在了某个地方)。

                                             **方案一**

使用TeamView自带的API来实现远程控制。(仅限TM)
优点:简单。
缺点:需要借助浏览器。

本示例仅给出了获取ID和远程控制的代码,使用这种的方法仍需要输入对方的密码才能连接。随机密码的获取可以使用Windows API。

B获取本地TeamViewer的ID传给A或服务器

-------------------------------------首先引入命名空间
using System.Net;
using System.Net.Sockets;-----------------------下面是客户端获取TeamViewerID并发送给服务器的函数public void send(){TcpClient client;try{client = new TcpClient();client.Connect("localhost", 8500);      // 与服务器连接}catch (Exception ex){MessageBox.Show("连接服务器失败");return;}RegistryKey key = Registry.LocalMachine;RegistryKey keyID = key.OpenSubKey("SOFTWARE\\Wow6432Node\\TeamViewer", true);String ID = keyID.GetValue("ClientID").ToString();NetworkStream streamToServer = client.GetStream();byte[] buffer = Encoding.Unicode.GetBytes(ID);     // 获得缓存streamToServer.Write(buffer, 0, buffer.Length);     // 发往服务器}

下面这一段代码是寻找注册表中TeamViewer的ID。有了ID就可以远程控制了。

  RegistryKey key = Registry.LocalMachine;RegistryKey keyID = key.OpenSubKey("SOFTWARE\\Wow6432Node\\TeamViewer", true);string ID = keyID.GetValue("ClientID").ToString();

A获取B发送的TeamViewer ID从而实现远程控制。

--------------------------------------同样引入命名空间
using System.Net;
using System.Net.Sockets;
using Microsoft.Win32;----------------------------------下面是服务器接收客户端内容并远程控制的代码public void receive(){const int BufferSize = 8192;    // 缓存大小,8192字节IPAddress ip = new IPAddress(new byte[] { 127, 0, 0, 1 });TcpListener listener = new TcpListener(ip, 8500);listener.Start();           // 开始侦听while(true){TcpClient remoteClient = listener.AcceptTcpClient();    // 获取一个连接,同步方法,在此处中断NetworkStream streamToClient = remoteClient.GetStream();   //获取Streambyte[] buffer = new byte[BufferSize];int bytesRead = streamToClient.Read(buffer, 0, BufferSize);    // 获得请求的字符串String ID = Encoding.Unicode.GetString(buffer, 0, bytesRead);String teamViewer = "start.teamviewer.com/" + ID ;System.Diagnostics.Process.Start("iexplore.exe", teamViewer);    //启动IE浏览器远程控制}}

下面这一段就是远程控制的代码了~~

    String teamViewer = "start.teamviewer.com/device/" + ID + "/au-thorization/password/mode/control";System.Diagnostics.Process.Start("iexplore.exe", teamViewer);     //启动IE浏览器远程制

是不是很简单~~~想具体了解的可以参考TeamViewer文档

                                            **方案二**

使用Windows API实现远程控制

优点:不需借助浏览器,更加方便。
缺点:较为复杂。

首先B要自动获取自己的ID和密码。然后上传到服务器或者传给A。

B首先通过

IntPtr maindHwnd = FindWindow(null, "TeamViewer"); //获得句柄  

获取TeamView或AnyDesk的句柄
接下来用一个循环遍历子窗口

 IntPtr winPtr = GetWindow(maindHwnd, GetWindowCmd.GW_CHILD);

通过

 GetClassName(winPtr, stringBuilder1, stringBuilder1.Capacity);

判断每一个子窗口的类型。如果是自己需要的就读取它的值。(通过Spy来查看TeamView和AnyDesk各个控件的句柄,以此判断自己需要子窗口的类型)

 GetWindowText(winPtr, stringBuilder, stringBuilder.Capacity);

这样B就可以自动得到TeamView和AnyDesk的ID和密码了。A得到ID和密码后同样使用Windows API(SendMessage)可以自动输入ID和密码实现远程控制。

因为有人私信,下面给出部分代码参考.

首先引入相应命名空间

         [DllImport("User32.dll", EntryPoint = "FindWindow")]public extern static IntPtr FindWindow(string lpClassName, string lpWindowName);[DllImport("User32.dll", EntryPoint = "FindWindowEx")]public static extern IntPtr FindWindowEx(IntPtr hwndParent, IntPtr hwndChildAfter, string lpClassName, string lpWindowName);[DllImport("User32.dll", EntryPoint = "SendMessage")]private static extern int SendMessage(IntPtr hWnd, int Msg, IntPtr wParam, StringBuilder lParam);[DllImport("user32.dll", EntryPoint = "GetWindowText")]public static extern int GetWindowText(IntPtr hwnd, StringBuilder lpString, int cch);[DllImport("user32.dll", SetLastError = true)]static extern IntPtr GetWindow(IntPtr hWnd, GetWindowCmd uCmd);[DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Auto)]static extern int GetClassName(IntPtr hWnd, StringBuilder lpClassName, int nMaxCount);[DllImport("user32.dll", EntryPoint = "ShowWindow")]private static extern bool ShowWindow(IntPtr hWnd, int nCmdShow);      //恢复窗口 1是 SW_SHOWNORMAL

获取TeamViewer的ID和随机密码:

  public int getTeamViewInfo(){int index = 0;int number = 0;const int BM_CLICK = 0xF5;const int WM_SETTEXT = 0xC;const int WM_GETTEXT = 0xD;while (true){Thread.Sleep(1000);number++;IntPtr maindHwnd = FindWindow(null, "TeamViewer"); //获得句柄   if (maindHwnd != IntPtr.Zero){IntPtr winPtr = GetWindow(maindHwnd, GetWindowCmd.GW_CHILD);//  3、循环取得桌面下的所有子窗口while (winPtr != IntPtr.Zero){//       4、继续获取下一个子窗口IntPtr winPtr1 = GetWindow(winPtr, GetWindowCmd.GW_CHILD);while (winPtr1 != IntPtr.Zero){StringBuilder stringBuilder1 = new StringBuilder(512);StringBuilder stringBuilder2 = new StringBuilder(512);StringBuilder stringBuilder3 = new StringBuilder(512);GetWindowText(winPtr1, stringBuilder1, stringBuilder1.Capacity);  //获取控件文本GetClassName(winPtr1, stringBuilder2, stringBuilder2.Capacity);  //获取控件类型SendMessage(winPtr1, WM_GETTEXT, (IntPtr)stringBuilder3.Capacity, stringBuilder3);  //向控件发送消息str = stringBuilder1.ToString();if (str.Equals("连接到伙伴")){//// SendMessage(winPtr1, BM_CLICK, (IntPtr)stringBuilder3.Capacity, stringBuilder3);connect = winPtr1;}str = stringBuilder2.ToString();if (str.Equals("ComboBox")){connect_id = winPtr1;}if (str.Equals("Edit")){teamviewer_id = stringBuilder3.ToString();return 1;//if (index == 0)//{//    teamviewer_id = stringBuilder3.ToString();//}//if (index == 1)//{//    teamviewer_password = stringBuilder3.ToString();//    return 1;//}//index++;}//获取当前子窗口中的下一个控件winPtr1 = GetWindow(winPtr1, GetWindowCmd.GW_HWNDNEXT);}//获取当前子窗口中的下一个控件winPtr = GetWindow(winPtr, GetWindowCmd.GW_HWNDNEXT);}}if (number >10){return 0;}}}

获取AnyDesk的ID:

    public int getAnyDeskInfo(){int index = 0;int number = 0;const int BM_CLICK = 0xF5;const int WM_SETTEXT = 0xC;const int WM_GETTEXT = 0xD;while (true){Thread.Sleep(1000);number++;IntPtr maindHwnd = FindWindow(null, "AnyDesk"); //获得句柄   if (maindHwnd != IntPtr.Zero){IntPtr winPtr = GetWindow(maindHwnd, GetWindowCmd.GW_CHILD);//  3、循环取得桌面下的所有子窗口while (winPtr != IntPtr.Zero){//       4、继续获取下一个子窗口IntPtr winPtr1 = GetWindow(winPtr, GetWindowCmd.GW_CHILD);while (winPtr1 != IntPtr.Zero){IntPtr winPtr2 = GetWindow(winPtr1, GetWindowCmd.GW_CHILD);while (winPtr2 != IntPtr.Zero){StringBuilder stringBuilder1 = new StringBuilder(512);//    GetWindowText(winPtr1, stringBuilder1, stringBuilder1.Capacity);SendMessage(winPtr2, WM_GETTEXT, (IntPtr)stringBuilder1.Capacity, stringBuilder1);str = stringBuilder1.ToString();if (str.Equals("This Desk") || str.Equals("此工作台")){while (true){winPtr2 = GetWindow(winPtr2, GetWindowCmd.GW_HWNDNEXT);StringBuilder stringBuilder2 = new StringBuilder(512);GetClassName(winPtr2, stringBuilder2, stringBuilder2.Capacity);str = stringBuilder2.ToString();if (str.Equals("id_label_cls#12\n")){StringBuilder stringBuilder3 = new StringBuilder(512);GetWindowText(winPtr2, stringBuilder3, stringBuilder3.Capacity);anydesk_id = stringBuilder3.ToString();return 1;}}}winPtr2 = GetWindow(winPtr2, GetWindowCmd.GW_HWNDNEXT);}winPtr1 = GetWindow(winPtr1, GetWindowCmd.GW_HWNDNEXT);}winPtr = GetWindow(winPtr, GetWindowCmd.GW_HWNDNEXT);}}if (number > 10){return 0;}}}

最后

整个过程其实比较简单,主要是借助Windows API。获取TM和AD的函数都是项目中的实际代码
可以参考我的百度经验

c#调用TeamViewer或AnyDesk实现远程控制相关推荐

  1. 哪家好用?四款国内外远程桌面软件横测:ToDesk、向日葵、TeamViewer、AnyDesk

    一.前言 远程桌面软件对于职场人来说并不陌生,可以说是必备的办公软件之一.在经历过新冠疫情后,大家对于远程办公的认识越来越深入,也就在这段期间,远程桌面软件大范围的应用起来,真正走进大众视野并融入我们 ...

  2. 如何使用anydesk进行远程控制?进来长知识

    在进行内网渗透的时候,如果目标机器出网,但是有时候目标3389端口未开放也就表示我们无法使用远程桌面进行连接.但是依然有很多第三方远程控制软件可以帮助我们,例如Teamviewer或者AnyDesk. ...

  3. 【小卒ubuntu使用第六篇】ubuntu下如何搭建远程控制服务(包括命令行方式的ssh局域网搭建、和图形化界面的teamviewer和anydesk工具的安装使用)

    最近由于实验室技术需要,组建网络服务,刚开始只是局限于局域网下,所以只采用ssh就足够了,连接同一个局域网,分布式控制机器合作,比较简单,但是后来主机天天携带不方便,就需要穿网的服务,经过自己的摸索和 ...

  4. Linux基础——怎么样用 TeamViewer 和 VNC 从远程控制电脑

    文章目录 1.前言 2.Teamviewer 3.VNC 4.用 Mac 连接 VNC 5.用 Windows 连接 VNC 6.用 Linux 连接 VNC 1.前言 VNC 或者 Teamview ...

  5. 软件分享 目前最友好的开源远程桌面软件,完美替代 TeamViewer 和 AnyDesk

    本文已收录到个人网站:https://jonssonyan.com,欢迎评论转发. RustDesk官网地址: https://rustdesk.com/zh/ 今天在逛GitHub时候突然发现一个神 ...

  6. 谁是远程界的天花板?2023年5款最常用的远程软件横测:ToDesk、向日葵、TeamViewer、Splashtop、AnyDesk

    前言 一个优秀的远控软件,追求的是可信赖的安全感,连接的流畅度.画质的清晰度.操作的简单化.毫秒级的无感延迟以及全方位的功能.另外,远控软件还应拥有独立的创新技术,具备竞争对手无法超越的市场前瞻性,与 ...

  7. TeamViewer介绍:远程控制计算机

    TeamViewer是一个可以远程控制计算机的程序,它也可以进行远程文件传输.TeamViewer支持的平台比较多,如Windows, Mac, Linux, ChromeOs, Android, i ...

  8. 2023年最强手机远程控制横测:ToDesk、向日葵、Airdroid三款APP免Root版本

    前言 随着远程办公和远程协作的日益普及,跨设备.系统互通的远程控制软件已经成为职场人士不可或缺的工具之一.在国内,向日葵和ToDesk是最著名的远程控制软件:而在国外,则有微软远程桌面.AirDroi ...

  9. 远程控制virtual box虚拟机系统的三种方式

    远程控制virtual box虚拟机系统的三种方式[阅读时间:5分钟] 1.使用现有的远程控制软件 2.使用SSH连接 3.使用远程桌面控制虚拟机系统 对于把虚拟机安装在寝室笔记本的人来说,能够远程控 ...

最新文章

  1. 青龙羊毛——悦读(搬运)
  2. 《我在51CTO微职位学软考——奋发之路》
  3. 创建一个CentOS 7的模板
  4. SpringCloud微服务全栈实战讲解 - 公开课笔记
  5. (转)光照图的理论和实践
  6. Scala学习:Curry化的函数
  7. maya扇子动画_maya怎么制作一个万箭齐发的效果?
  8. 《机器学习实战》笔记(02):k-近邻算法
  9. DEDE 会员调用方法详解
  10. 【升级包】jeecg_online 支持主子表列表展示风格模板升级包,简易升级
  11. Spring好处—总结
  12. php使用redis消息队列swoole,swoole+Redis实现实时数据推送
  13. (转) windows 下ORA-12514:TNS 监听问题
  14. 【LwM2M】LwM2M协议官方文档
  15. QTreeWidget 设置图片以及图片大小
  16. python中对文件的操作总结
  17. 中国海洋大学计算机系实习报告,中国海洋大学海洋学实习报告.doc
  18. [GitHub] JavaScript 趋势榜项目(第30周)
  19. win7无损分区和硬盘分区调整合并
  20. Bootstrap CSS Layout (1) - Breakpoint

热门文章

  1. 美团网登录注册教程笔记
  2. 故障:安装OFFICE2007时,刚开始安装,就提示“windows installer 服务不能更新一个或多个受保护的windows文件”,然后安装回滚,最后退出安装。
  3. O-1 4GB+的ISO镜像刻录
  4. 前端开发的发展方向都有哪些?职业方向定位?
  5. python异常处理的作用_Python 中的异常处理方式
  6. linux操作系统培训_免费在线技术培训丨SLE201v15 SUSE Linux Enterprise Server 15 管理课程...
  7. BLY-HT-450无线温度传感器
  8. Linux利用sendmail和fetion发送报警通知
  9. 如何做一个手机产品标签
  10. mysql建学生-课程数据库_有一个“学生-课程”数据库,数据库中包括三个表:...