前言

有时候,影城报障需要远程过去重现和处理,如果电脑没有安装远程工具的话,还需要营业员下载和安装,然后将账号密码发送过来,这样一来一回操作繁琐也浪费时间,所以我们可以设想一下这种场景,售票员点击在pos点击远程协助按钮,运维童鞋就在后台看到相应的远程账号和密码,瞬间远程过去。如果要实现这个功能的话,我们需要pos能够获取远程工具的账号和密码,回传到服务端。那么,我们就市面上比较常用的远程工具试试看吧。

XT800

协通800是国内的一款远程工具,有官方的SDK可以集成到我们的系统中,不过是要收费的。我们现在要做的是不收费的,测试的版本是4.3.8版本,界面如下

使用spy++工具,得知大部分元素如 "本机号码","授权码"等都是统一封装在名为XTMainRemoteWnd的类上,这些封装的元素是获取不到的,只有少部分元素是有句柄的,如下图

我们需要获取元素正好有句柄的,是可以读取,但是没其他元素可以辅助定位,那么我们只能通过长度来判断了,代码如下

static void FindXT800()
{
IntPtr windowHandler = FindWindow(null, "XT800 个人版"); //获得句柄
FindXT800All(windowHandler);
}
static void FindXT800All(IntPtr intPtr)
{
IntPtr winPtr1 = GetWindow(intPtr, );//获得子窗体
while (winPtr1 != IntPtr.Zero)
{
StringBuilder type = new StringBuilder();
StringBuilder text = new StringBuilder();
GetClassName(winPtr1, type, type.Capacity); SendMessage(winPtr1, WM_GETTEXT, (IntPtr)text.Capacity, text); if (type.ToString() == "Edit" && text.ToString().Length == )
{
Console.WriteLine("账号:"+text.ToString());
}
if (type.ToString() == "Edit" && text.ToString().Length == )
{
Console.WriteLine("密码:"+text.ToString());
}
FindXT800All(winPtr1); //递归
winPtr1 = GetWindow(winPtr1, );//获得同级下一个窗体
}
}

需要注意的是,如果XT800隐藏到系统右下角的栏里就获取不到句柄的。

TeamViewer

TeamViewer是国外的一款软件,也是收费的。不过使用体验上,感觉比XT800好一点,例如支持双屏远程,这就能够很方便地操作拥有客屏的远程机。测试版本是13.2,界面如下:

使用spy++得知这个界面的元素基本都是有句柄,所以我们可以根据标题辅助定位到账号和密码,代码如下

 static void FindTeamViewer()
{
IntPtr windowHandler = FindWindow(null, "TeamViewer"); //获得句柄
FindTeamViewAll(windowHandler);
}
static void FindTeamViewAll(IntPtr intPtr)
{
IntPtr winPtr1 = GetWindow(intPtr, );//获得子窗体
List<string> valueList=new List<string>();
while (winPtr1 != IntPtr.Zero)
{
StringBuilder type = new StringBuilder();
StringBuilder text = new StringBuilder();
GetClassName(winPtr1, type, type.Capacity); SendMessage(winPtr1, WM_GETTEXT, (IntPtr)text.Capacity, text); if (type.ToString() == "Static" && text.ToString()=="您的ID")//您的ID
{
valueList.Add(text.ToString());
}
if (type.ToString() == "Edit")
{
valueList.Add(text.ToString());
}
if (type.ToString() == "Static" && text.ToString() == "密码")//密码
{
valueList.Add(text.ToString());
}
if (type.ToString() == "Edit")
{
valueList.Add(text.ToString());
} FindTeamViewAll(winPtr1); //递归
winPtr1 = GetWindow(winPtr1, );//获得同级下一个窗体
}
if (valueList.Count > )
{
if (valueList.Contains("您的ID"))
{
Console.WriteLine("账号:" + valueList[].Replace(" ", ""));
}
if (valueList.Contains("密码"))
{
Console.WriteLine("密码:" + valueList[]);
}
}
}

AnyDesk

AnyDesk听说是原TeamViewer团队开发,质量还是有保证的,更关键的是它提供脚本获取账号密码,不用麻烦地获取句柄。测试版本是4.2.2,界面如下

使用spy++工具得知界面元素是有句柄的,不过我们现在是使用它的api获取账号和设置密码,方法是通过执行放在程序目录下的bat文件获取,具体代码如下:

static void Main(string[] args)
{
ExecBatFile("GetUserId.bat");
ExecBatFile("SetPassword.bat");
Console.ReadLine();
}
static void ExecBatFile(string file)
{
ProcessStartInfo pro = new ProcessStartInfo("cmd.exe");
pro.UseShellExecute = false;
pro.CreateNoWindow = true;
pro.RedirectStandardInput = true;
pro.RedirectStandardOutput = true;
pro.RedirectStandardError = true;
pro.FileName = file;
pro.WorkingDirectory = Environment.CurrentDirectory;
Process proc = Process.Start(pro);
proc.Start(); StreamReader sOut = proc.StandardOutput;
proc.WaitForExit();
proc.Close();
string results = sOut.ReadToEnd().Trim(); //回显内容
Console.WriteLine(results);
sOut.Close();
}

小结

上文比较了三种远程工具的账号密码获取方式,目前来看,anydesk的获取方式最靠谱,毕竟是官方的API,其他两款走的都是旁门左道。另外anydesk不用安装,只有一个2m的exe程序,非常方便集成在我们的产品中。个人还是比较推荐anydesk的。

参考文档

https://blog.csdn.net/zcheva/article/details/76063017

https://blog.csdn.net/FaaronZheng/article/details/46897033

最新文章

  1. FFmpeg 转码和截屏
  2. js动态生成选项之考试系统(一)
  3. SQLServer中系统存储过程sp_spaceused
  4. Bootstrap使用初涉
  5. DataTable 导到Excel
  6. [ActionScript 3.0] AS3.0 将图像的Alpha通道转换为黑白图像(分离ARGB方式)
  7. python分割数组里面重复的元素
  8. sqlserver中查找长时间未提交事务
  9. 快速排序算法 Quick sort
  10. DataTable与Linq相互转换
  11. 「JavaScript」手起刀落-一起来写经典的贪吃蛇游戏
  12. 纯CSS3模拟星体旋转效果
  13. c语言中的堆、栈和内存映射
  14. Ubuntu 服务器上面--安装和配置mysql 【转】
  15. [luogu4860][Roy&amp;October之取石子II]
  16. 24小时学通Linux内核之向内核添加代码
  17. U盘上安装Ubuntu系统 便捷式系统 - 赖大大
  18. 图片相似原理--Java实现
  19. springboot 项目pom.xml文件基本配置
  20. Centos上安装配置docker(命令集)

热门文章

  1. Deepin安装 ruby 包管理工具 RVM(适用于 Debian 系列)
  2. xml的解析及案例的分析和分享
  3. Echarts-数据的视觉映射
  4. 【原】iptables 交叉编译
  5. web渗透系列--信息收集
  6. java高并发核心要点|系列4|CPU内存指令重排序(Memory Reordering)
  7. python 类的成员及继承
  8. 多层for循环嵌套,如何能优化一点点,从运行时间维度
  9. java 流操作对文件的分割和合并的实例详解_java - JAVA
  10. 对 Promises/A+ 规范的研究 ------引用