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 禁用关闭按钮 | | pauseCOPY |
示例代码二:设置文字颜色 | @echo off | | APICall kernel32.dll GetStdHandle -11 | | set hOut=%errorlevel% | | APICall kernel32.dll SetConsoleTextAttribute %hOut%,32791 | | echo hello | | pauseCOPY |
示例代码三:设置光标位置到(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 | | pauseCOPY |
批注:
由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 | | pauseCOPY |
示例代码五:闪烁CMD窗口 | @echo off | | APICall kernel32.dll GetConsoleWindow | | set hCMD=%errorlevel% | | APICall user32.dll FlashWindow %hCMD%,1 | | pauseCOPY |
示例代码六:获得鼠标位置 | @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% | | pauseCOPY |
上例演示了处理两个返回值的方法
可以看到,API给批处理注入了强大的生命力,尽管现在APICall并不完善。。。
希望下载的同学能多多捧场,谢。。。 |