找回密码
 加入
搜索
查看: 25989|回复: 80

[转贴] Win32API简单教程第一讲[By dingamao ]

 火... [复制链接]
发表于 2008-5-21 19:10:33 | 显示全部楼层 |阅读模式
       嗯,首先说明一下,本人也是初学不久,难免会有不足之处,希望大家多多谅解。然后,这个API教程系列呢,基本上以这篇帖子里提到的两篇APi帮助文档作为参考,所以大家还是去下载回来的好。然后我发的是中文版,虽然不如英文版的那篇那么详细,但对初学者来说也足够了。一开始的时候如无特殊说明,我尽可能采用中文版本里面的函数,方便大家,以后如果遇上某些API只能往英文版里面寻找而中文版里面没有,我会特别注明。
       第一篇呢,我就采用AutoIt帮助文档里面的例子,从最简单的说起~
       首先大家打开v3.2.3.12.2版的帮助文档AutoIt3.chm,找到这个函数的说明DLLCALL。为什么呢,因为凡是要通过加载DLL文件的API都必须通过这个DLLCALL,当然帮助文档的注意部分也说了,可以使用DllOpen 和 DllClose 函数执行相应操作,这个就不在今天的讨论范围了,这里的重点在于说API。


QUOTE:
DllCall ( "dll", "返回值类型", "函数名" [, "类型1", 参数1 [, "类型 n", 参数 n]] )


这部分单独来看基本是摸不着头脑的,还要结合实例来讲解,嗯,今天我们就以示例1来讲讲吧~说明一下,大家就不要直接点“打开此脚本”,因为里面的脚本是英文的,为了更好讲解,大家还是用回帮助文件里面说的这一个~


QUOTE:
$result = DllCall("user32.dll", "int", "MessageBox", "hwnd", 0, "str", "这是对话框的文本", "str", "这是对话框的标题", "int", 0)
好了,进入正文。


今天要讲的API函数是Messagebox,首先请大家打开Win32API帮助文档,找到Messagebox,这些内容:


QUOTE:
       函数原型:int MessageBox(HWND hWnd,LPCTSTR IpCaption,UINT UType);
       参数:
       hWnd:标识将被创建的消息框的拥有窗口。如果此参数为NULL,则消息框没有拥有窗口。
       IpText:指向一个以NULL结尾的、含有将被显示的消息的字符串的指针。
       IpCaption:指向一个以NULL结尾的、用于对话框标题的字符串的指针。
       uType:指定一个决定对话框的内容和行为的位标志集。此参数可以为下列标志组中标志的组合。还有这一处:
       速查:Windows NT:3.1以上版本;Windows:95以上版本:Windows CE:1.0以上版本;头文件:Winuser.h;库文件:user32.lib:


"user32.dll"对应的就是 "dll",由此处决定:“库文件:user32.lib”,注,可别写成user32.lib了~
"int"对应的就是"返回值类型",由此处决定:函数原型:Int GetWindowText。这里已经指明,是用Int。
"MessageBox"对应的就是"函数名" ,没什么好讲的了吧,因为我们今天讲的就是这个函数,调用的就是这个函数~
"hwnd", 0, "str", "这是对话框的文本", "str", "这是对话框的标题", "int", 0)对应的是 [, "类型1", 参数1 [, "类型 n", 参数 n]] ,调用的API函数有多少个参数,就有多少个类型及参数要填上去。

那么,我们从Win32api的帮助文档里面可以知道,Messagebox此函数共有4个参数,于是我们就要设4次。
第一次:"hwnd", 0,~~~为什么类型是hwnd呢,因为这个参数用来标识窗口,所以是窗口句柄类型
第二次:"str", "这是对话框的文本",~~~为什么类型是str呢,因为这个参数是字符串。
第三次: "str", "这是对话框的标题",~~~理由同上。它们的参数类型是一样的,只是作用不一样,前者是指定对话框中显示的消息,后者是对话框的标题。
第四次:"int", 0~~~这里比较特殊,API中许多标志集最终都要靠将其转为16进制数,再在函数中声明…关于这一点可能是Au3的“特色”,我在网上找的C++里调用此API时,这个参数直接可以填写MB_OK,而Au3则受限制,必须填0。如果想出现带有三个按钮的对话框,此参数在API手册中为MB_ABORTRETRYIGNORE,那么在Au3里,应该填其对应的16进制数0x2……这个数我又是怎么知道的呢,API手册中没有说呀?呃,其实我是参考了AutoIt帮助手册才找到的,大家可以在其Msgbox中找得到,里面不是有个表格列出了各种对话框对应的10进制与16进制数吗,其实就是从MessageBox这个API中得到的。

       至此,这个最基本的API函数就讲完了,我总结一下:
1.首先是在API手册中得到你要使用的API函数的原型、参数、库文件。
2.然后在Au3中以DLLcall来加载此函数,其中最费功夫的就是参数一项,你要知道每项参数属于什么类型~这里一定不能忘记的是必须先写参数的类型,然后才是参数,而它们总是成对一起出现。可不要像Au3脚本语言一样,只需要填上参数即可。
嗯,为了加深印象,大家可以再对比一下Au3中的MsgBox的用法,比较一下异同点。
最后说一下,第一课我没有讲太过深奥的函数,取了一个比较简单的,所以大家会觉得比较枯燥,还会觉得这一课讲的API没有什么实用性,是的,太多东西要自己手动设置,不如在Au3里的函数。这是因为我们现阶段还只涉及到上层的API,它们基本都在Au3里有相应的可视化操作,故显示不出其优越性。随着学习的加深,要想开发出更灵活、更实用、更具效率的应用程序,必然要涉及到直接使用API函数,当到了需要下层API(没有可视化操作,必须手动编写API函数)的时候,才能体会它的强大。
而第一课的简单,只是起一个开头的作用,主要目的只在于,让大家明白API的基本操作,为以后的学习打好基础。
基础,总是很沉闷的。



[ 本帖最后由 逍遥子 于 2008-5-22 09:31 编辑 ]

评分

参与人数 3金钱 +30 贡献 +10 收起 理由
zps26 + 30
小菜kks + 5
maker + 5 怎么没人给你加分?

查看全部评分

发表于 2008-5-21 21:41:42 | 显示全部楼层
文字稍微小了点。顶起,好帖。
发表于 2008-6-4 21:49:04 | 显示全部楼层
唉,再顶一次吧。积分都没有了。
发表于 2008-6-5 01:21:09 | 显示全部楼层
学习了,一直不明白那一串int int int ,现在明白了点点。多谢楼主,希望继续。
发表于 2008-6-7 17:42:29 | 显示全部楼层
没有看懂。。。。。。。。
发表于 2008-6-25 21:14:14 | 显示全部楼层
完全没有看懂
水平菜呀
回去补课去了
发表于 2008-7-25 08:58:49 | 显示全部楼层
发表于 2008-7-27 11:59:43 | 显示全部楼层
如果再浅显一点,通俗一点,效果会更好。我只知道:
DLL是一个函数大集合,一个DLL包含了1个以上的函数,像user32.dll中就包含含了MessageBox等函数。光知道调用其中的那个函数还不行,还要知道这个函数的入口参数,跟调用自定义函数道理是一样的。
所以,使用DLL中的函数,你得对这个函数的参数有了解才行。
发表于 2008-9-6 01:27:12 | 显示全部楼层
学习了,谢谢
发表于 2008-10-9 14:14:26 | 显示全部楼层
如果再浅显一点,通俗一点,效果会更好。我只知道:
DLL是一个函数大集合,一个DLL包含了1个以上的函数,像user32.dll中就包含含了MessageBox等函数。光知道调用其中的那个函数还不行,还要知道这个函数的入口参数,跟调用自定义函数道理是一样的。
所以,使用DLL中的函数,你得对这个函数的参数有了解才行。
发表于 2008-10-11 13:37:59 | 显示全部楼层
学习了,谢谢     
发表于 2008-10-11 22:29:10 | 显示全部楼层
为什么到最后都要用到api?
发表于 2008-10-20 01:31:11 | 显示全部楼层
发表于 2008-10-21 01:11:28 | 显示全部楼层
唉、、、就单看帮助文件已经费神了
发表于 2008-11-25 14:25:37 | 显示全部楼层
哈哈,找到这个我想不明白的资料了。在提问区怎么没人推荐这个给我看。。。
您需要登录后才可以回帖 登录 | 加入

本版积分规则

QQ|手机版|小黑屋|AUTOIT CN ( 鲁ICP备19019924号-1 )谷歌 百度

GMT+8, 2024-4-27 13:27 , Processed in 0.080452 second(s), 21 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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