前言

有时候,影城报障需要远程过去重现和处理,如果电脑没有安装远程工具的话,还需要营业员下载和安装,然后将账号密码发送过来,这样一来一回操作繁琐也浪费时间,所以我们可以设想一下这种场景,售票员点击在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

【Win32 API】远程工具调用的更多相关文章

  1. MSIL 教程(二):数组、分支、循环、使用不安全代码和如何调用Win32 API(转)

    转自:http://www.cnblogs.com/Yahong111/archive/2007/08/16/857574.html 续上文[翻译]MSIL 教程(一) ,本文继续讲解数组.分支.循环 ...

  2. C#调用Win32 api学习总结

    从.NET平台调用Win32 API Win32 API可以直接控制Microsoft Windows的核心,因为API(Application Programming Interface)本来就是微 ...

  3. Python调用win32 API绘制正弦波

    Python调用win32 API新建窗口与直接创建窗口的流程相同 流程:注册窗口→创建窗口→显示窗口→更新窗口→消息循环 代码: # -*- coding: utf-8 -*- import win ...

  4. C#调用Win32 api时的内存操作

    一般情况下,C#与Win 32 Api的互操作都表现的很一致:值类型传递结构体,一维.二维指针传递IntPtr.在Win32 分配内存时,可以通过IntPtr以类似移动指针的方式读取内存.通过IntP ...

  5. Java APi 之 RMI远程方法调用

    一.什么是RPC RPC全称是remote procedure call,即远程过程调用.它是一种协议,用于从远程计算机上请求服务. 例如有两台服务器A和B,A上的应用想要调用B上应用的方法,但是他们 ...

  6. nodejs 调用win32 api

    video 教程文件 win32 api >node -v v12.16.1 >npm install -g node-gyp >npm i @saleae/ffi >node ...

  7. Detours简介 (拦截x86机器上的任意的win32 API函数)

    Detours 当然是用detours,微软明显高腾讯一筹,同上,至今没失败过.写这种HOOK一定要再写个测试程序,不要直接HOOK你的目的程序,例如QQ,因为这样不方面更灵活的测试.说明一下:Det ...

  8. MSComm控件与Win32 API操作串口有何区别?

    MSComm控件与Win32 API操作串口有何区别? [问题点数:50分,结帖人shell_shell]   收藏帖子 回复 我是一个小兵,在战场上拼命!   结帖率 83.33% 我以前用MSCo ...

  9. SpringBoot关于系统之间的远程互相调用

    1.SpringBoot关于系统之间的远程互相调用 可以采用RestTemplate方式发起Rest Http调用,提供有get.post等方式. 1.1远程工具类 此处使用Post方式,参考下面封装 ...

随机推荐

  1. picgo+typora优化markdown体验

    picgo+typora优化markdown体验 写markdown的时候许多图片的存放的上传是一个大问题,之前一直都是使用先截图,在commit之后,再将线上图片地址粘贴到相应的位置 现在知道了pi ...

  2. [转载]Jupyter Notebook中自动补全代码

    原文地址:https://yq.aliyun.com/articles/667928 在公众号之前的文章中,已经介绍了在Jupyter Notebook中设置主题以及输出代码文件到pdf文件中,本文来 ...

  3. JDK1.8+API+中文文档+高清完整版(不要积分 免费拿)

    JDK1.8+API+中文文档+高清完整版+CHM帮助文档 链接: https://pan.baidu.com/s/1LbdWSZ4qFjWXdJ88bXkn5w 提取码: frew 希望能帮上大家的 ...

  4. Js和Jquery实现ajax长轮询

    众所周知,HTTP协议是无状态的,所以一次的请求都是一个单独的事件,和前后都没有联系.所以我们在解决网页实时聊天时就遇到一个问题,如何保证与服务器的长时间联系,从而源源不段地获取信息. 一直以来的方式 ...

  5. 解析html,提取元素参数

    r = s.get(loginurl, verify=False) dom = etree.HTML(r.content.decode("utf-8")) try: result[ ...

  6. Delphi 常用系统函数与过程

  7. 用python实现js语言里的特性

    有大佬说:“搜 arraybuffer 的 polyfill 然后翻译成 python就行了” ...

  8. 三、Vue CLI-单页面

    一.单页面 代码如下: <template> <div class="header">{{title}}</div> </template ...

  9. Synchronized 失效原因

    Synchronized 同步出现失效 Synchronized ,大家都知道这个是Java 提供的一种原子性内置锁,其实现原理是通过获取对象的监视器monitor进行来实现同步的,只有当线程获取到对 ...

  10. Softmax函数与交叉熵

    在Logistic regression二分类问题中,我们可以使用sigmoid函数将输入Wx+b映射到(0,1)区间中,从而得到属于某个类别的概率.将这个问题进行泛化,推广到多分类问题中,我们可以使 ...