前言

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

    win32:CONFIG(release, debug|release): { LIBS +=$$PWD/../../../thirdparty\qwt\lib\qwt.lib LIBS +=$$PW ...

  2. c#委托(Delegates)--基本概念及使用

    在我这菜鸟理解上,委托就是可以用方法名调用另一方法的便捷方法,可以简化switch等语句的重复.最近做项目的时候恰好需要用到委托,便来复习及学习委托的使用.嗯...本人以前并没有用过,只是稍微知道而已 ...

  3. 【微信小程序】图片压缩-纯质量压缩,非长宽裁剪压缩

      原理:利用canvas来实现,将图片绘制到canvas上,然后canvas转图片时,微信提供的一个方法wx.canvasToTempFilePath(Object object, Object t ...

  4. js node 节点 原生遍历 createNodeIterator

    1.createIterator msn: https://developer.mozilla.org/en-US/docs/Web/API/Document/createNodeIterator v ...

  5. 设备树里面#address-cells 、#size-cells、reg三者的关系

    栗子1: cpus { #address-cells = <>; #size-cells = <>; cpu@ { compatible = "arm,cortex- ...

  6. 如何在Linux下安装JDK1.8

    本文会详细介绍如何在Linux下安装JDK1.8 首先要设置虚拟机的IP地址,不知道如何设置的话可以 翻看我的前一篇博客   http://www.cnblogs.com/xiaoxiaoSMILE/ ...

  7. java高并发核心要点|系列4|CPU内存指令重排序(Memory Reordering)

    今天,我们来学习另一个重要的概念. CPU内存指令重排序(Memory Reordering) 什么叫重排序? 重排序的背景 我们知道现代CPU的主频越来越高,与cache的交互次数也越来越多.当CP ...

  8. uboot dcc

    arch\arm\lib crt0.S 1.设置sp为CONFIG_SYS_INIT_SP_ADDR include/configs/xxx.h #define CONFIG_SYS_INIT_SP_ ...

  9. nll_loss

    ''' torch.nn torch.nn.functional (F)CrossEntropyLoss cross_entropy LogSoftmax log_softmax NLLLoss nl ...

  10. spring事务配置,声明式事务管理和基于@Transactional注解的使用(转载)

    原文地址:http://blog.csdn.net/bao19901210/article/details/41724355 事务管理对于企业应用来说是至关重要的,好使出现异常情况,它也可以保证数据的 ...