找回密码
 注册
搜索
[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
楼主: went

wapi 调用win32 api

[复制链接]
发表于 前天 22:39 | 显示全部楼层

模仿写了个鼠标操作的

  1. @echo off
  2. cd/d%~dp0
  3. wapi -init %_初始化_%

  4. ::获取鼠标位置
  5. wapi -rcall hHeap kernel32 GetProcessHeap
  6. wapi -rcall lpMem kernel32 HeapAlloc $hHeap #0 #8
  7. wapi -call User32 GetCursorPos $lpMem
  8. for /f %%x in ('wapi -mget lpMem -d')do set "横坐标x=%%x"
  9. for /f %%y in ('wapi -mget lpMem -d -offset 4')do set "纵坐标y=%%y"
  10. wapi -call kernel32 HeapFree $hHeap #0 $lpMem
  11. echo 鼠标指针坐标(%横坐标x%,%纵坐标y%)

  12. ::设置鼠标位置
  13. wapi -call User32 SetCursorPos #200 #100

  14. ::单击        ::鼠标操作
  15. ::wapi -call User32 mouse_event #6 #0 #0 #0 #0
  16. ::右键
  17. wapi -call User32 mouse_event #18h #0 #0 #0 #0

  18. wapi -free %_释放资源_%
  19. pause
  20. goto :eof
复制代码

  1. @echo off
  2. cd/d%~dp0
  3. wapi -init %_初始化_%

  4. ::获取鼠标位置
  5. ::wapi -rcall hHeap kernel32 GetProcessHeap
  6. ::wapi -rcall lpMem kernel32 HeapAlloc $hHeap #0 #8
  7. wapi -set 坐标 "12345678" %_坐标占8字节内存_%
  8. wapi -call User32 GetCursorPos $坐标
  9. for /f %%x in ('wapi -mget 坐标 -d')do set "横坐标x=%%x"
  10. for /f %%y in ('wapi -mget 坐标 -d -offset 4')do set "纵坐标y=%%y"
  11. ::wapi -call kernel32 HeapFree $hHeap #0 $lpMem
  12. echo 鼠标指针坐标(%横坐标x%,%纵坐标y%)

  13. ::设置鼠标位置
  14. wapi -call User32 SetCursorPos #200 #100

  15. ::双击        ::鼠标操作
  16. wapi -call User32 mouse_event #6 #0 #0 #0 #0
  17. wapi -call User32 mouse_event #6 #0 #0 #0 #0
  18. ::右键
  19. ::wapi -call User32 mouse_event #18h #0 #0 #0 #0

  20. wapi -free %_释放资源_%
  21. pause
  22. goto :eof
复制代码

评分

参与人数 1技术 +1 收起 理由
went + 1 好例子

查看全部评分

 楼主| 发表于 前天 22:54 | 显示全部楼层

要直接设置cmd的变量,要用远程线程注入的方式,报毒几率非常大,所以还是用for捕获输出吧

评分

参与人数 1技术 +1 收起 理由
cutebe + 1 原来如此,了解。

查看全部评分

发表于 昨天 15:12 | 显示全部楼层
本帖最后由 cutebe 于 2026-11-14 17:46 编辑

为字符串申请内存时,需要多一个字节\0,或多两个字符\0\0。
能否添加简单整数运算?

wapi -set 字符串 "设置剪贴板文本SetClipboardData1"
wapi -rcall 字节数 kernel32 lstrlenA $字符串
wapi -rcall 内存句柄 kernel32 GlobalAlloc #42h $字节数+1        //如红色的这个

另:测试字符串变量最大长度1024字节,超过时会卡死。
发表于 昨天 15:19 | 显示全部楼层

剪贴板操作

测试一下
  1. @echo off
  2. cd/d%~dp0
  3. wapi -init %_初始化_%

  4. ::操作剪贴板文字
  5. call :获取剪贴板文本
  6. echo 以上显示剪贴板文本内容
  7. pause

  8. call :清空剪贴板
  9. echo 当前剪贴板已清空
  10. pause

  11. set "字符串文本=设置剪贴板文本SetClipboardData1"
  12. call :设置剪贴板文本 "%字符串文本%"
  13. call :获取剪贴板文本

  14. wapi -free %_释放资源_%
  15. pause
  16. goto :eof
  17. ::=====结束=====


  18. ::-----函数-----
  19. :获取剪贴板文本 有字节数限制
  20. wapi -call User32 OpenClipboard #0 %_打开剪贴板_%
  21. wapi -rcall 内存句柄 User32 GetClipboardData #1 %_获取剪贴板文本数据_%
  22. ::wapi -rcall 内存地址 kernel32 localLock $内存句柄 %_错误:加载函数失败_%
  23. wapi -rcall 内存地址 kernel32 GlobalLock $内存句柄
  24. wapi -rcall 内存字节数 kernel32 GlobalSize $内存句柄
  25. wapi -rcall hHeap kernel32 GetProcessHeap
  26. wapi -rcall lpMem kernel32 HeapAlloc $hHeap #0 $内存字节数
  27. wapi -rcall 复制长度 kernel32 lstrcpynA $lpMem $内存地址 $内存字节数
  28. ::wapi -call kernel32 localUnlock $内存句柄 %_错误:加载函数失败_%
  29. wapi -call kernel32 GlobalUnlock $内存句柄
  30. wapi -call User32 CloseClipboard %_关闭剪贴板_%
  31. wapi -get lpMem -str %_显示文本_%
  32. wapi -call kernel32 HeapFree $hHeap #0 $lpMem
  33. goto :eof

  34. :清空剪贴板
  35. wapi -call User32 OpenClipboard #0 %_打开剪贴板_%
  36. wapi -call User32 EmptyClipboard %_清空剪贴板_%
  37. wapi -call User32 CloseClipboard %_关闭剪贴板_%
  38. goto :eof

  39. :设置剪贴板文本 字符串文本
  40. set "剪贴板文本=%~1"
  41. wapi -call User32 OpenClipboard #0 %_打开剪贴板_%
  42. wapi -call User32 EmptyClipboard %_清空剪贴板_%
  43. wapi -set 剪贴板文本 "%剪贴板文本%0"
  44. wapi -rcall 文本字节数 kernel32 lstrlenA $剪贴板文本
  45. wapi -rcall 内存句柄 kernel32 GlobalAlloc #42h $文本字节数
  46. wapi -rcall 内存地址 kernel32 GlobalLock $内存句柄
  47. wapi -rcall 复制长度 kernel32 lstrcpynA $内存地址 "%剪贴板文本%" $文本字节数
  48. wapi -call kernel32 GlobalUnlock $内存句柄
  49. wapi -rcall 文本内容 User32 SetClipboardData #1 $内存句柄 %_设置剪贴板文本数据_%
  50. wapi -call User32 CloseClipboard %_关闭剪贴板_%
  51. goto :eof
复制代码
 楼主| 发表于 昨天 20:20 | 显示全部楼层
cutebe 发表于 2026-11-14 15:12
为字符串申请内存时,需要多一个字节\0,或多两个字符\0\0。
能否添加简单整数运算?

变量长度是无限制的,只是管道通信的buf只设置了1024字节,用来给for交换数据, 超过-get -str会引发内存越界
cmd变量长度本身也有限制 当然可以设计为直接打印内存字符串,但就不能用for捕获了,所以有限制
发表于 昨天 23:47 | 显示全部楼层
went 发表于 2026-11-12 22:37
1.1版更新了内存编辑功能 wapi -sample有详细用法

厉害了, 更新的这么快
不过命令行参数好像只解析一次, 也只执行一次
如果像imagemagick那样逐个解析并处理直到结束的话就能省很多事了

  1. wapi -init -rcall hHeap kernel32 GetProcessHeap -rcall lpMem1 kernel32 HeapAlloc $hHeap #8h #16 -free
复制代码



 楼主| 发表于 6 小时前 | 显示全部楼层
1.3更新了格式化输出功能, -out,单独缓冲区10mb,注意此输出不能用for捕获,纯输出功能
示例 - 格式化输出.bat
  1. @echo off & cd /d "%~dp0"
  2. set "PATH=%PATH%;.."

  3. rem 初始化
  4. wapi -init
  5. REM wapi -init -debug

  6. wapi -set n1 #1234567
  7. wapi -set f1 @3.1415926
  8. wapi -set str "hello world"

  9. wapi -out "输出: n1=%%d,0x%%xh,%%q f1=%%10f str=%%s" $n1 $n1 $$n1 $f1 $str

  10. rem 释放资源
  11. wapi -free

  12. pause&exit

  13. :err
  14. echo 调用失败
  15. pause&exit
复制代码
 楼主| 发表于 6 小时前 | 显示全部楼层

wapi -out "剪贴版数据:%%s" $lpMem
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|批处理之家 ( 渝ICP备10000708号 )

GMT+8, 2026-11-15 07:20

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表