标题: [其他] 【发布】批处理调用API——APICall [打印本页]
作者: defanive 时间: 2010-2-22 23:12 标题: 【发布】批处理调用API——APICall
http://bcn.bathome.net/s/tool/index.html?key=APICall
自从BatProject开始编写后,越来越忙,临近中考,时间也没了。。。
本已不打算再干第三方这行,但是还是做了这个东西,希望能给批处理带来些变化。。。
这只是一个测试版本,因此还有很多缺陷。。。
从一定意义上来讲,批处理是不可能完美调用API的,因此我只求能做得比别人更好。。。
APICall能做到的是,可以一定限度上使用结构体。。。
调用方式:
APICall Dll路径 API名称 参数1,参数2,参数3……
注意,这是以,为分隔(因为缺陷,无论是否在引号中都会被分割,例如"hello,123")
参数可以是:
Long型数字:传值,例如123
String型文字:传址,但是由于缺陷,必须按照这个格式:"字串符""
由Long型组成的结构体:传址,例如{0;0},注意,这是以;号为分割
返回值:
可以指定返回值(只能在结构体中指定,因为只有结构体是传址):{_0;0}
给结构体中的指定参数加_代表执行完之后将这个值返回
最多可以指定2个返回值,如{_0;_0}
如果不指定,则返回API的返回值
例如指定了{_0;_0},如果执行完之后值是{123;456},那么返回值%errorlevel%将是
100000000+10000*值2+值1,上例的返回值将是104560123
如果只指定一个,那么直接返回值
示例代码一:禁用CMD的关闭按钮- @echo off
- APICall kernel32.dll GetConsoleWindow
- set hCMD=%errorlevel%
- APICall user32.dll GetSystemMenu %hCMD%,0
- set hMenu=%errorlevel%
- APICall user32.dll EnableMenuItem %hMenu%,61536,1
- echo 禁用关闭按钮
- pause
复制代码
示例代码二:设置文字颜色- @echo off
- APICall kernel32.dll GetStdHandle -11
- set hOut=%errorlevel%
- APICall kernel32.dll SetConsoleTextAttribute %hOut%,32791
- echo hello
- pause
复制代码
示例代码三:设置光标位置到(20,10)- @echo off
- APICall kernel32.dll GetStdHandle -11
- set hOut=%errorlevel%
- set /a Pos=20*65536+10
- APICall kernel32.dll SetConsoleCursorPosition %hOut%,%Pos%
- echo 设置光标到20,10
- pause
复制代码
批注:
由API声明可以知道SetConsoleCursorPosition第二个参数应为COORD类型,由2字节X坐标及2字节Y坐标构成,总大小4字节
虽然APICall只支持4字节的参数,整个COORD正好是4字节,因此将2个2字节数据转换成1个4字节数据即可,也就是X*65536+Y
示例代码四:测试CMD所有字体大小- @echo off
- APICall kernel32.dll GetStdHandle -11
- set hOut=%errorlevel%APICall kernel32.dll GetNumberOfConsoleFonts
- set Total=%errorlevel%
- for /l %%a in (1,1,%Total%) do (
- echo %%a号字体大小
- APICall kernel32.dll SetConsoleFont %hOut%,%%a
- pause
复制代码
示例代码五:闪烁CMD窗口- @echo off
- APICall kernel32.dll GetConsoleWindow
- set hCMD=%errorlevel%
- APICall user32.dll FlashWindow %hCMD%,1
- pause
复制代码
示例代码六:获得鼠标位置- @echo off
- APICall user32.dll GetCursorPos {_0;_0}
- set PT=%errorlevel%
- set /a Y=%PT:~0,-4%-10000
- set /a X=PT-10000*Y-100000000
- echo 鼠标的位置为:X:%X%,Y:%Y%
- pause
复制代码
上例演示了处理两个返回值的方法
可以看到,API给批处理注入了强大的生命力,尽管现在APICall并不完善。。。
希望下载的同学能多多捧场,谢。。。
作者: yslyxqysl 时间: 2010-2-22 23:37
返回值能不能用位运算...
作者: Seter 时间: 2010-2-23 10:04
CallWindowProc到底怎么用...为什么我还是觉得要用asm...
作者: Seter 时间: 2010-3-1 08:28
既然都知道了函数&调用值说明有编程基础,既然有基础还不如自己写程序。。。所以我不觉得APICALL有什么意义。。
作者: Seter 时间: 2010-3-1 08:29
用ASM是肯定可以的。。。都是LONG型嘛。。加个jmp就OK
作者: daols 时间: 2010-3-22 18:51
E:\幻想游戏系列\幻想游戏4.6\天地大冲撞\msvbvm60.dll
-___-...程序里咋还有这些东西。。。有源码么。。。。我想删了图标啥的让程序变小点,,,
作者: sl543001 时间: 2010-4-3 02:20
俺需要精简版,方便的话给一个精简版
就是说吧包括图标在内的所有非必要部分去掉
作者: sl543001 时间: 2010-4-3 02:21
当然,有源码就更好了
作者: bxbian951122 时间: 2010-4-4 17:22
这是vb写的。。那位大哥能改成VC或者Delphi啊。。
作者: defanive 时间: 2010-4-4 18:10
如果能用C++或者其他语言重新写一次的话,可以解决dll的依赖问题,以及文件大小的问题。。。
图标是编译的时候VB自带的图标,不懂如何删去。。。
需要源码的同学可以问我要源码,但是我希望要源码的目的不是要来随便看看而已,希望能真的研究一下,有能力的同学希望能用C++重新写一份,为三方做点贡献。。。
作者: bat007 时间: 2010-4-4 19:24 标题: 回复 10楼 的帖子
你们技术组没有一个会C++的?
作者: defanive 时间: 2010-4-4 21:47 标题: 回复 11楼 的帖子
正值冷清时节,人都不知道去哪了。。。
作者: xie 时间: 2010-4-26 17:50
哥们,参数定义(源码的)的核心能否透露一下,,,
作者: xie 时间: 2010-4-26 17:53
跪求看一下工程源码。呵呵
作者: xueshe165 时间: 2010-10-14 09:46
用ASM是肯定可以的。。。都是LONG型嘛。。加个jmp就OK
欢迎光临 批处理之家 (http://bbs.bathome.net/) |
Powered by Discuz! 7.2 |