HMC-win32: 更加轻松的连接系统API
You are currently viewing the Chinese version of the introduction. You can click 【README】 to view the English version of this README.
帮助
我们提供了多份编程语言帮助文档 可供了解api的调用,但是他可能更新时间不及时,因为api非常多,需要编写文档是个不小的工程,hmc使用的是 TypeScript 编写的 并且他预带了一份类型声明 可以让您在主流的 ide编辑器 中显示类型 以及用法
代码参考性 : CPP 代码已经分离为独立 模块详见 hmc-module
相关的链接 :
子集 (Subset)
hmc-autoit 是hmc的子集 他包含了一些列调用 autoitX api的函数,并且和hmc的优点一样,不需要再次编译和ffi魔法
我为什么要使用这个模块?
- 零依赖 hmc不依赖于第三方模块 也不需要您需要懂得C++ 编程知识
- 对执行速度有要求 在此之前我在使用node执行一些复杂功能 只能通过命令行去调用程序执行 他的取值和调用 非常困难 而且最少多出100ms 的消耗
- hmc调用的基本都是系统API,他在大多数情况下非常迅速,hmc对自己的api进行了大量的转换,让参数输入和返回更加轻松 ,不需要您对系统有很清晰的了解,hmc非常轻便 你甚至可以在只有两个文件的时候正常运行,并且不依赖于多出的dll等文件
- hmc在大多数情况下对内存的消耗几乎可以忽略不计
为您总结了几种功能的分类
-
窗口操作 :调整 / 枚举 / 禁用 / 查询 / 变化
-
进程控制 :kill / 信息 / 句柄 / 窗口 / 变化
-
[网 络](#网络 (net)) :端口 / 网卡 / 局域网 / IP
-
文件系统 :软链接 / 硬链接 / USB
-
环境变量 :用户变量 / 系统变量 / 同步 / 转义
-
剪 贴 板 :文件列表 / 读写 / 文本 / 变化
-
自 动 化: :键盘 / 鼠标 / 执行 / 读取 / autoit3
-
注 册 表 :读 / 写
-
电源控制 : 关机 / 重启 / 注销 / 显示器 / 启动时间
-
Shell :回收站 / Message / 快捷方式 / 执行软件 / 选取文件 / 保存文件
-
互斥体 : 创建 / 销毁 (防止进程重复启动)
-
托 盘 :创建 / 枚举 / 销毁
installation
npm i hmc-win32
How to call
let HMC = require("hmc-win32");
console.log("App:Admin=>",HMC.isAdmin())
//App:Admin=> true
console.log("SystemIdleTime=>",HMC.getSystemIdleTime())
//SystemIdleTime=> 25
console.log("escapeEnvVariable=>",HMC.escapeEnvVariable("%AppData%\hmc-win32"))
//escapeEnvVariable=> C:\Users\...\AppData\Roaming\hmc-win32
console.log("Clipboard=>",setClipboardFilePaths(["D:/1.jpg"]),HMC.getClipboardFilePaths())
//Clipboard=> true , ["D:/1.jpg"]
In TypeScript using the
import HMC = require("hmc-win32");
功能概览
窗口操作
- closedHandle 关闭句柄
- setWindowMode 设置窗口位置大小
- getWindowRect 获取窗口位置大小
- getDeviceCaps 获取屏幕大小
- getPointWindow 获取鼠标所在窗口的句柄
- getPointWindowName 获取鼠标所在窗口的进程名
- getPointWindowProcessId 获取鼠标所在窗口的进程id
- getPointWindowMain 获取鼠标所在窗口的父窗口
- getPointWindowMain 获取鼠标所在窗口的父窗口
- getWindowProcess 获取句柄对应的进程id
- getProcessWindow 获取进程对应的主进程/线程的窗口句柄
- getWindowTitle 获取此句柄的标题
- setWindowTitle 设置此句柄的标题
- setShowWindow 通过句柄设置窗口显示状态
- isWindowVisible 判断此句柄是否是正在活动中的窗口
- closeWindow 关闭此句柄对应的窗口
- getForegroundWindow 获取活动窗口句柄
- getAllWindows 获取所有窗口的信息
- getMainWindow 获取该句柄下的父窗口
- setWindowTop 顶设窗口
- isWindowTop 窗口是否被顶设
- setWindowShake 窗口抖动
- updateWindow 刷新窗口
- setWindowFocus 设置窗口聚焦
- setWindowEnabled 设置窗口是否支持响应事件(鼠标键盘点击)
- isEnabled 判断窗口是否支持响应事件(鼠标键盘点击)
- SetWindowInTaskbarVisible 是否在状态栏显示该图标
- setHandleTransparent 设置窗口不透明度
- SetBlockInput 阻止键盘和鼠标输入事件到达应用程序。
- WatchWindowPoint 当鼠标所在的窗口变更的时候发生回调
- WatchWindowForeground 当聚集的窗口变更的时候发生回调
- getAllWindowsHandle 获取所有句柄 并返回一个HWND 的伪数字方法集 (getAllWindows 的替代 获取 200000次进程无影响)
- HWND (类) Number(伪)
- HWND number
- closed 强制结束句柄
- close 向窗口发送关闭的消息
- rect 窗口位置 (访问时自动获取)
- title 标题 (访问时自动获取)
- setTitle 设置标题
- exists 句柄是否有效 (访问时自动获取)
- isHandle 句柄是否有效 (访问时自动获取)
- pid 句柄的附属进程id (访问时自动获取)
- MianPid 句柄的 主线程/主进程 id (访问时自动获取)
- MainHandle 主句柄
- isVisible 可见性
- kill 结束 主进程/主线程
- hide 隐藏
- show 显示
- setMin 最小化
- setMax 最大化
- setRestore 恢复最近的状态
- setFocus 聚集
- setEnabled 禁用
- isEnabled 是否禁用
- setJitter 窗口抖动
- isTop 是否顶设
- setTopOrCancel 取消顶设 / 设置顶设
- setOpacity 设置 不透明度 0-100 / 0.0-1.0
- setTransparent 设置 不透明度 0-255 (alpha)
- enumChildWindows 枚举句柄的子窗口
- setWindowTitleIcon 设置标题窗口图标icon
- getWindowClassName 获取窗口类名
- getAllWindowsHandle 获取所有窗口的句柄 增加一个参数 是否要求必须为窗口
- setForegroundWindow 设置窗口聚焦
- getAllWindows 默认使用 isWindows 为true
- getWindowStyle 获取窗口类关联代码
- setWindowIconForExtract 通过可执行文件或者带有图标的文件设置窗口图标
进程控制
-
killProcess 结束该pid进程
-
sleep 同步阻塞(进程)
-
openApp 打开程序
-
getProcessList 获取进程列表
-
getDetailsProcessList 获取详细进程列表(慢20ms)
-
getProcessWindow 获取进程对应的主进程/线程的窗口句柄
-
getProcessName 获取进程名
-
getProcessFilePath 获取进程可执行文件位置
-
getForegroundWindowProcessID 获取活动窗口的进程id
-
getWindowProcess 获取句柄对应的进程id
-
isProcess 判断进程id 是否存在
-
hasProcess 判断进程id 是否存在
-
killProcessName 结束该名称 /(正则)匹配的 进程
-
processWatchdog 当监察的进程结束时候执行回调
-
getProcessNameList 获取该名称 /正则匹配的进程列表
-
getDetailsProcessNameList 获取该名称 /正则匹配的进程列表 带执行文件路径 慢20ms
-
getModulePathList 查询进程加载的模块
-
getProcessThreadList 枚举进程的线程id
-
getProcessParentProcessID 获取进程的主进程
-
getSubProcessID 获取子进程id列表
-
enumProcessHandle 枚举进程id的句柄
-
enumAllProcessHandle 枚举所有进程id的句柄
-
findProcess 搜索进程
-
getProcessStartTime 获取进程启动时间 (ms)
-
尾部带有2的为2.0api 均支持异步(2 / 2Sync ):**
- 异步
Promise
- 异步
callback
- 异步
Promise
- 均支持并发
-
findProcess2 搜索进程 异步
-
findProcess2Sync 搜索进程 同步
-
getAllProcessList2 异步
获取进程列表(枚举) 枚举是最快的也不受应用是32位系统64位导致无法枚举到 但是信息不够细
- pid 进程id
- name 由镜像路径解析
- path 镜像路径
-
getAllProcessList2Sync 同步
获取进程列表(枚举)
-
getAllProcessList2Snp 异步
获取进程列表 (快照) 请注意 如果可执行文件是32位而系统是64位将获取不到64位进程的信息
- pid 进程id
- name 由镜像路径解析
- ppid 父进程id
- ... : cntThreads cntUsage dwFlags dwSize pcPriClassBase th32DefaultHeapID th32ModuleID
getAllProcessListSnp2Sync 同步
获取进程列表 (快照)
-
getAllProcessListNt2 异步
获取进程列表 (内核)
- pid 进程id
- name 软件名称
- BasePriority NextEntryOffset NumberOfThreads PagefileUsage pcPriClassBase PeakPagefileUsage PeakWorkingSetSize QuotaNonPagedPoolUsage Reserved [1-6]
-
getAllProcessListNt2Sync 同步
获取进程列表 (内核)
-
getProcessCpuUsage2 异步
获取进程占用的cpu
-
getProcessCpuUsage2Sync 同步
获取进程占用的cpu
-
getProcessNameSnp2Sync 同步
获取进程的名称(快照)
-
getProcessNameSnp2 异步
获取进程的命令行(快照)
-
getProcessNameNt2Sync 同步
获取进程的名称(内核)
-
getProcessNameNt2 异步
获取进程的命令行(内核)
-
getProcessName2Sync 同步
获取进程的名称(正常)
-
getProcessName2 异步
获取进程的命令行(正常)
-
getProcessCommand2 异步
获取指定进程的启动命令行
-
getProcessCommand2Sync 同步
获取指定进程的工作目录
-
getProcessCwd2 异步
获取指定进程的工作目录
-
getProcessCwd2Sync 同步
获取指定进程的启动命令行
状态栏
- getTrayList 获取托盘图标
- closedHandle 关闭托盘图标(提交句柄)
系统操作
- SetSystemHOOK (禁用/启用系统键盘鼠标钩子 (高级api) )
- getHidUsbList 获取所有HidUsb设备(仅限HID设备)
- getShortcutLink 获取快捷方式内容
- setShortcutLink 设置快捷方式内容
- isSystemX64 判断当前系统是否是x64
- messageBox 消息窗口(调用 win-api)
- getSystemMenu 设置系统右键菜单 例如win自带的系统菜单就很丑还不能禁用 使用这个禁用
- clearClipboard 清空剪贴版
- setClipboardText 设置剪贴板文本
- getClipboardText 获取剪贴板文本
- setClipboardFilePaths 向剪贴板写入文件列表
- getClipboardFilePaths 向剪贴板读取文件列表
- openApp 打开程序
- isAdmin 判断当前软件是否拥有管理员权限
- getSystemIdleTime 系统空闲时间
- systemStartTime 系统启动到现在的时间
- system 同 C++/C 的system
- alert 方法用于显示带有一条指定消息和一个 确认 按钮的警告框
- confirm 方法用于显示带有一条指定消息和 确认 和取消 的按钮的消息框
- MessageStop 方法用于显示带有一条指定消息和一个 确认 按钮的和❌(X)的消息框
- MessageError 方法用于显示带有一条指定消息和一个 确认 按钮的错误框 附带有❗ 感叹号。
- systemChcp 当前系统shell的chcp信息
- deleteFile 将文件放入回收站
- trash 将文件放入回收站
- getClipboardSequenceNumber 获取当前剪贴板内容的id(如果被重新写入了该id会变动)
- watchClipboard 当剪贴板内容变更后发生回调
- watchUSB 当驱动器添加或者移除后发生回调
- keyboardHook 低级键盘输入变化获取
- mouseHook 低级鼠标位置变化获取
- freePort 获取一个空闲可用的端口号
- hasPortTCP 判断TCP(服务)端口号正在使用/系统占用 (反向理解:为true的话不能创建端口绑定)
- hasPortUDP 判断UDP端口号正在使用/系统占用(反向理解:为true的话不能创建端口绑定)
- _popen 创建管道并执行命令
- popen 创建管道并执行命令
- formatVolumePath 格式化 驱动器路径 ('\Device\HarddiskVolume2' => "D:\")
- getVolumeList 获取当前文件系统的驱动器名称及路径
- getTCPPortProcessID 获取指定TCP端口的pid
- getTCPPortProcessID 获取指定UDP端口的pid
- createMutex 创建进程互斥体(全局)
- hasMutex 判断进程互斥体(全局)
电源控制
- systemStartTime 系统启动到现在的时间
- shutMonitors 关闭显示器
- showMonitors 恢复显示器
- powerControl 电源控制
- 1001 关机
- 1002 重启
- 1003 注销
- 1005 锁定
- shutDown 关机
- restart 重启
- cancellation 注销
- lock 锁定
注册表编辑
-
hasRegistrKey 判断键值是否存在
-
getStringRegKey 获取内容(文本)
-
removeStringRegKey 删除数据
-
setRegistrKey 设置键值对
-
createPathRegistr 创建新的路径
-
enumRegistrKey 枚举键值
-
getRegistrBuffValue 获取内容(二进制 Buffer)
-
openRegKey 打开该路径并返回方法的封装
-
listRegistrPath 将该路径下的内容以objcet 的方式显示
-
removeStringRegKeyWalk 删除一个文件夹键值
-
removeStringRegKey 删除一个文件夹key
-
removeStringRegValue 删除一个值
-
setRegistrDword 设置一个32位数字
-
setRegistrQword 设置一个64位数字
-
getRegistrDword 获取一个32位数字
-
getRegistrQword 获取一个64位数字
-
registr 注册表处理的集合
- analysisDirectPath 将一条完整的注册表路径 转为 数组 拆分为 [ HKEY: HKEY, Path: string, key?: string]
- has
- get
- remove
- keys
- list
- create
- open
键盘鼠标USB
- getHidUsbList 获取所有HidUsb设备(仅限HID设备)
- setCursorPos 设置鼠标位置
- mouse 自定义鼠标事件
- hasKeyActivate 判断该按键是否被按下
- leftClick 左键点击
- rightClick 右键点击
- getBasicKeys 获取四大按钮是否按下
- getMouseMovePoints 获取鼠标之前64个位置
- getUsbDevsInfo 获取所有usb驱动器(不包含HUD)
- keyboardHook 低级的键盘变化监听构造函数
- mouseHook 低级的鼠标变化监听构造函数
- sendBasicKeys 向系统发送标准的快捷键 例如 : ctrl+win+C
- getColor 获取指定位置的颜色
- captureBmpToFile 截图指定位置并且写入文件 (BMP)
- sendKeyboard 发送键盘事件
- sendKeyboardSequence 发送键盘事件序列
- sendKeyT2CSync 同步执行t2c 脚本 (一种快捷的 更加符合人类编写键鼠操作的文本微脚本)
- sendKeyT2C 异步执行t2c 脚本 (一种快捷的 更加符合人类编写键鼠操作的文本微脚本)
- getCursorPos 获取鼠标光标所在位置的坐标
- hasMouseLeftActivate 判断鼠标左键是否被按下
- hasMouseRightActivate 判断鼠标右键是否被按下
- hasMouseMiddleActivate 判断鼠标中键是否被按下
- hasMouseBtnActivate 判断鼠标的按钮按下状态
- setLimitMouseRange 设置鼠标坐标到指定位置 并且限制在一定范围内(时间ms)
文件链接/快捷方式
WebView2
- getWebView2Info 当前安装的WebView2 信息
- hasWebView2 当前电脑是否安装了 WebView2
- WebView2OnlineInstall 在线安装WebView2
变量环境(Environment)
-
Environment 合集
-
hasKeyExists 判断变量中是否存在指定值 用户
系统
-
hasUseKeyExists 判断变量中是否存在指定值 用户
-
hasSysKeyExists 判断变量中是否存在指定值 系统
-
escapeEnvVariable 通过当前的变量对变量内容进行解析(不受进程变量影响)实时
- HMC_x64.escapeEnvVariable("%AppData%\hmc-win32") log -> 'C:\Users\...\AppData\Roaming\hmc-win32'
-
removeUserVariable 删除一个用户变量 用户
-
removeVariable 删除一个用户变量 用户
系统
-
removeSystemVariable 删除一个用户变量 系统
-
getSystemVariable 获取一个在系统变量中的值 系统
- transMean %AppData%\hmc-win32 -> 'C:\Users\...\AppData\Roaming\hmc-win32'
- transMean %AppData%\hmc-win32 -> '%AppData%\hmc-win32'
-
getUserVariable 获取一个在用户变量中的值 用户
- transMean %AppData%\hmc-win32 -> 'C:\Users\...\AppData\Roaming\hmc-win32'
- transMean %AppData%\hmc-win32 -> '%AppData%\hmc-win32'
-
getVariableAnalysis 获取一个在用户变量中的值 用户
系统
-
putSystemVariable 添加一个系统变量 (请注意 win进程获取的优先级: 进程变量 -> 用户变量 -> *系统变量) path变量不受此影响(win定义)
- append 添加到尾部 而不是替换 "ddd" -> "oid...;ddd"
- transMean 转义 "%AppData%\hmc-win32" -> 'C:\Users\...\AppData\Roaming\hmc-win32'
-
putUserVariable 添加一个系统变量 (请注意 win进程获取的优先级: 进程变量 -> 用户变量 -> *系统变量) path变量不受此影响(win定义)
- append 添加到尾部 而不是替换 "ddd" -> "oid...;ddd"
- transMean 转义 "%AppData%\hmc-win32" -> 'C:\Users\...\AppData\Roaming\hmc-win32'
-
getVariableAll 获取所有的值 从环境读取 (进程环境)
-
getRealGlobalVariableList 获取所有的值 从注册表读取 (配置环境)
-
getUserKeyList 获取用户变量的键列表用户
-
getSystemKeyList 获取系统变量的键列表 系统
-
updateThis 同步系统(全局)变量到当前进程
网络 (net)
- ipv4 获取本机局域网的ip(v4)
- ip 获取本机局域网的ip(适配器,v4,v6)
- adapterIP 获取本机局域网的ip(适配器,v4,v6)
- public_ip 获取本机公网ip
- getNetParams 获取主机网络信息
- freePort 获取一个tcp空闲端口 (服务)
- freePortTCP 获取一个空闲的tcp端口
- freePortUDP 获取一个空闲的udp端口
- hasPortUDP 判断此udp端口是否空闲
- hasPortTCP判断此TCP端口是否空闲
- getSystemProxyServer 获取系统代理链接(仅在启用系统代理时)
- getSystemProxyPac 获取系统代理pac脚本链接
- getDomainIPaddress 从默认dns(联网)解析域名主机ip
- getHostsPath 获取hosts文件的路径
- getTCPv6PortProcessID 获取此端口被哪个进程占用了
- getUDPv6PortProcessID 获取此端口被哪个进程占用了
- getUDPv4PortProcessID 获取此端口被哪个进程占用了
- getTCPv4PortProcessID 获取此端口被哪个进程占用了
- getConnectNetList 枚举此电脑中的 端口 ipv4 and ipv6 的 TCP,UDP 端口信息
- killProcess 结束该pid进程(低权利 如果需要高权限的kill请使用hmc-win32)
- sleep 同步阻塞(进程)
- Sleep 异步阻塞(进程)
- PortWatchdog 检测端口变化如果关闭或者启用时发起回调
- getProcessidFilePath 获取进程可执行文件位置
- isAdmin 判断当前软件是否拥有管理员权限
API中间层
- ref 转换
- bool 将布尔内容转为安全的 bool 类型布尔
- string 将文本/伪文本内容转为安全的文本
- int 将数字/伪数字内容转为安全的int数字
- HKEY 所有注册表的 HKEY 对象
- Sleep 异步的阻塞
- default 映射整个功能组(兼容ejs)
- hmc 映射整个功能组(兼容局部导出)
- native 直接连接HMC.node的原生方法 (不建议使用)
其他
重新构建
HMC所有API采用winapi+nodeapi实现,因此无需重新编译(允许运行在node8以上环境 node6.14.2 需要自行使用esbuld编译),如果您需要对源代码进行修改请使用node-gyp rebuild
进行编译,这需要有一定的C/C++基础,编译工具使用node-gyp即可,需要使用到的工具如下:
- node-gyp
- Visual Studio 2019(or other versions)
一些常见问题
-
子进程/线程 信息获取不全
- node 进程可执行文件是 32位的 但是系统是64位的 被枚举的 进程/线程/子进程/二次子进程 包含64位的
- 无法解决 因为 子进程/线程 使用进程快照消耗和安全性都最佳
风险告知
-
每个功能模块都会经过千次以上循环调用 无出现进程崩溃
-
API已经通过js严格转码 只有调用native才需要 但是由于C++和C语言都是严格类型,必须严格使用typeScript严格传递类型
-
虽然经过疲劳测试,但是还是有可能会有无法预期的进程奔溃,所以建议在子进程下运行
-
C++ 的野指针和空指针和内存溢出 引用错误 类型错误 等 对于进程都是致命的,所以在编写新功能时候需要不断地进行模拟疲劳测试