首页 VB+API初级入门

VB+API初级入门

举报
开通vip

VB+API初级入门 VB API 初级入门 (来源:CSDN) 经过 yydfz整理,作者不详,但看到写得不错很有参考价值,就整理发上来了,如果作 者认为侵权,请通知我,我马上删除。 接受网友的意见,写了一篇关于 VB API的文章,希望大家能从中学到一些知识。 一、API是什么? 这个我本来不想说的,不过也许你知道其它人不知道,这里为了照顾一下新手,不得不 说些废话,请大家谅解。 Win32 API即为Microsoft 32位平台的应用程序编程接口(Application Programming ...

VB+API初级入门
VB API 初级入门 (来源:CSDN) 经过 yydfz整理,作者不详,但看到写得不错很有参考价值,就整理发上来了,如果作 者认为侵权,请通知我,我马上删除。 接受网友的意见,写了一篇关于 VB API的文章,希望大家能从中学到一些知识。 一、API是什么? 这个我本来不想说的,不过也许你知道其它人不知道,这里为了照顾一下新手,不得不 说些废话,请大家谅解。 Win32 API即为Microsoft 32位平台的应用程序编程接口(Application Programming Interface)。所有在Win32平台上运行的应用程序都可以调用这些函数。 使用Win32 API,应用程序可以充分挖掘Windows的 32位操作系统的潜力。Mircrosoft 的所有 32位平台都支持统一的 API,包括函数、结构、消息、宏及接口。使用 Win32 API 不但可以开发出在各种平台上都能成功运行的应用程序,而且也可以充分利用每个平台特有 的功能和属性。 以上为 API的相关介绍,不过有些新手看了以后可能还是不怎么明白 API到底有什么 用?这里请不要着急,如果你有足够耐心的话,请慢慢往下看。 二、如何使用 API? 估计这才是大家真正关心的,那么如何使用 API呢?在了解 API之前,先打开你的 VB 书,翻到过程函数这章来,在搞清楚 API之前应该先搞懂过程函数是怎么一回事!如果你 还不知道过程的工作方式,那么请先不要急着往下看,那样容易走很多弯路。 好了,当你理解了过程函数时,也就是你可以使用 API的时候了,别把 API看得太难, 你就像使用过程函数一样使用 API就可以了。首先,让我们看看一个简单的 API,以下: Private Declare Sub Sleep Lib "kernel32" Alias "Sleep" (ByVal dwMilliseconds As Long) 以上这个 API的呢是起一个延时作用。你如果是刚接触 API的话可能会感到 API的书 写及其复杂,而且会感到很不适应。其实这没什么的,慢慢习惯就好了。至于 API这些复 杂的书写你就不用操心了,在你安装 VB的时候微软已经帮我们带上了 API浏览器,这些全 部都可以利用 API浏览器帮我们自动生成。API浏览器的位置位于[开始菜单-程序- Microsoft Visual Basic 6.0 中文版-Microsoft Visual Basic 6.0 中文版工具-API 文本浏览 器]。打开 API浏览器,在最上面的一个文本框中输入 Sleep,这时下面列 关于同志近三年现实表现材料材料类招标技术评分表图表与交易pdf视力表打印pdf用图表说话 pdf 框中就会自动显 示相应的 API函数,然后点右边添加按钮即可,接着点击复制按钮,这时你就可以用 Ctrl+V 把声明的 API添加到 VB代码窗口中了。 这里我要说一下,有些新手可能还弄不明白。API的声明范围一般有两种模式,一种是 Private(私有的),一种是 Public(公用的)。一般 Private是声明在类模块或窗体类中,Public声 明在模块中。你在添加 API的时候,添加按钮下面就有 API的声明范围,可以根据自己的 需要进行添加。这里我们一般选择私有的(Private)就可以了。 经过上面,我们知道如何添加 API,接着我们分析一下 API声明,这是你了解 API必 备的。首先看第一个单词 Private,很显然,我上面刚刚讲过,这是申明一个私有的 API变 量。再看第二个 Declare,这个单词帮我们告诉 VB是在申明 API函数,一般申明外在的 API 函数时都必须带上这个单词。第三个 Sub,别告诉我你不知道什么意思?这就是我叫你先学 习 VB中过程函数的意思,这个说白了就是没有反回值,一般如果不是 Sub而是 Function 都带有反回值的。第四个 Lib,这个是告诉 VB我们要声明哪一个 DLL中的 API函数,也 就是告诉 VB我们要申明第五个单词 kernel32.dLL中的 API,一般写 DLL名称时都要用双 引号括起来,如"user32"、"shell32.dll"等,至于后面的.dll这个可以带可不带。再来看第六个 Alias,这个也是需要同后面一个一起用的,我们应该把第六个和第七个连起来一起看 Alias "Sleep",这个意思表示将被调用的过程在 DLL中还有另外的名称,这个是可选的。最后括 号里面的,也就是和过程函数一样,你传入相应的值就可以了。 上面我们分析完 API函数声明以后,接着我们就要自己动手写代码了。先把这个 API 复制到 Form1代码窗口中,然后写如下代码: Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long) Private Sub Form_Load() Sleep 2000 End Sub 解释一下,也就是在窗体启动时使用Sleep API进行延时2秒,后面的参数dwMilliseconds 是表示你要延时的秒数,基本上和设置 Timer中的秒数一样。你再看一下 Sleep 2000的使 用方式,是不是和使用 VB过程函数一样呢?好了,我们的第一个 VB API程序写完了,可 以看到使用 API并不是一件很难的事。 三、如何才能提升你对 API的学习兴趣? API,我常把它看做成过程函数,不过每人都有每人的见解和理解方式,自己的理解方 式只要可以帮助自己更好的学习和掌握 API,也没必要一定要学习他人的。 1、自己做MsgBox 了解 API参数的使用方法是很重要的,这里我们不用 VB的MsgBox,直接使用 API弹 出MsgBox消息框。首先,打开 API浏览器,选择MessageBox,大家可以用这个 API和 VB内置的MsgBox比较一下,其实MsgBox也就是MessageBox的缩写,只不过一个是 API, 一个是 VB内置的,但两者都是通过 API进行工作的。好了,选择私有声明方式,粘贴到 VB代码编辑窗口中,然后新建一个 CommandButton,写入以下代码: Private Declare Function MessageBox Lib "user32" Alias "MessageBoxA" (ByVal hwnd As Long, ByVal lpText As String, ByVal lpCaption As String, ByVal wType As Long) As Long Private Sub Command1_Click() MessageBox Me.hwnd, "这里是内容", "标题", 0 End Sub 先让我们来分析一下,首先看第一个参数 Byval hWnd As Long,很显然这是一个长整形 变量,所以我们这里需要传递的是数字,你可能会发现我们传递的并不是数字啊,而是 Me.hwnd??很奇怪是吗?如果你真的有此疑问说明你是真心想要学习好 API的,现在就让 我们来看看Me.hwnd到底是什么东西?以下摘自 VB帮助文档: hWnd 属性:返回窗体或控件的句柄。 句 柄:是由操作环境定义的一个唯一的整数值,它被程序用来标识或者切换到对象, 如窗体或控件等。 现在估计你差不多就已经明白了,我们调用的 hwnd其实是一个句柄整数值,你可以用 Msgbox Me.hwnd 看一下就知道了。至于Me这是一个关键字,代表当前 Form窗体对象。 如:Me.Caption="标题"、Me.BackColor=vbRed等。 接上面的,首先我们传入了Me.hwnd,表示是当前窗口调用MessageBox,这里告诉大 家一个技巧,也就是以后凡是看到 Byval hwnd As Long,一般都是需要传入句柄的,至于传 入哪个对象句柄,那就要看你是怎么实现的了。 ByVal lpText As String,这个是字符串变量,标识着叫我们需要传入字符串进去,可以 看里面的变量字符 lpText,属于文本的意思,也就是说是用来显示MsgBox中的消息文本的。 ByVal lpCaption As String,也是字符串变量,还是传入字符串进去。在看里面的变量字 符 lpCaption,其实就是显示MsgBox标题的。 ByVal wType As Long,这是一个整形变量,需要传递整形数字,还是看里面的变量字 符 wType,标识着显示MsgBox类型,这里可以像 VB的MsgBox一样使用,如这里可以传 入:vbYesNo,vbOkCancel等,如果忽略那就传入 0即可。 好了,按 F5启动程序,点击 Command1,接着就会弹出一个消息框,这里我们制作以 及分析MsgBox已经完成了。希望你能在这段学习到一些知识。 2、来点实用的吧 就拿隐藏Windows任务管理器来说吧,这里只能隐藏任务管理器中的窗口,不能隐藏 进程。(问:有没有隐藏进程的?答:你想干什么?),当程序运行后你无法从任务管理器的 窗口中关闭程序,只能从进程中进行终止。好了,还是老规矩,打开 API浏览器,输入 GetWindow和 ShowWindow两个 API,声明范围还是私有的,复制粘贴到 Form代码窗口中, 嗯,好了?别急,还是 API浏览器,选择 Combox中的常数,输入 GW_OWNER和 SW_HIDE 这两个 API常数,然后粘贴到代码窗口中,问我这两个是干什么的?那就接着往下看吧。 写入以下代码: Private Declare Function GetWindow Lib "user32" (ByVal hwnd As Long, ByVal wCmd As Long) As Long Private Declare Function ShowWindow Lib "user32" (ByVal hwnd As Long, ByVal nCmdShow As Long) As Long Private Const GW_OWNER = 4 Private Const SW_HIDE = 0 Private Sub Form_Load() Dim lphWnd As Long lphWnd = GetWindow(Me.hwnd, GW_OWNER) ShowWindow lphWnd, SW_HIDE End Sub 又到了分析的时候了,这对刚入门的新手可谓是最激动的时候了。好了,还是老子,看 看两个 API的表面意思和传递值变量。 先看 GetWindow,表面意思:获取窗口。传递值变量:hWnd整形句柄,wCmd整形命令 值。 再看 ShowWindow,表面意思:显示窗口。传递值变量:hWnd整形句柄,nCmdShow 整形命令值。 然后是使用代码,先看 lphWnd = GetWindow(Me.hwnd, GW_OWNER)这句,这句意思 是获取当前窗口的所有者窗口句柄,可以看到 GetWindow是 Function过程函数,执行以后 会返回相应的窗口句柄值,这个值为 Long整形(同句柄)。接着调用 ShowWindow lphWnd, SW_HIDE,这句意思是显示 lphwnd这个句柄的窗口,关键一句是最后的 SW_HIDE,这是 API函数的常量。通过设置常量能让系统知道 API到底应该怎么执行显示窗口,是显示?还 是隐藏?Hide当然是隐藏的意思。好了,编译成 Exe,运行后打开任务管理器,查看程序窗 口,还有吗? 我又要说一下了,有些人可能不懂为什么要用 GW_OWNER这些常量,这些到底有什 么用?还有就是我怎么知道哪些 API对应哪些的常量?其实这些常量你只要稍微注意一下 就知道它们是怎么回事了,如在 GetWindow中我使用 GW_OWNER,在 ShowWindow中我 使用 SW_HIDE这些常量都有一个共同的特点,就是他们都是以 API的单词第一个字母为标 准。如 GetWindow相对应的常量就是 Get(G)Window(W)=GW,ShowWindow相对应的常就 是 Show(S)Window(W)=SW,这些常量可以自己在 VB的 API浏览器中找找看。 3、继续往下学吧 上面两个我们讲到了一般 API的使用方法,和一些 API常量的使用方法,接着我们来 看看 API类型的使用方法,在了解这一小节前请先搞懂 VB中的自定义类型(Type)这章,否 则你可能会稀里糊涂的,到时别怪我没提醒你哦! 这次让我们来获取一下鼠标指针的位置。这里教大家一个技巧,当你想用 API去实现 某一特定的功能时,却又不知道该用哪个 API,这时你可以就表面的意思到 API浏览器找找, 有 70%以上的机率可以找到哦!现在就拿这个 API开刀,那我们应该如何找?别着急,往 下看: 如我们现在要获取鼠标指针位置,可以这样翻译一下:Get(获取)Cursor(指针)Pos (位置),组合起来:GetCursorPos,呵呵,一条 API就这样出来了,到 API浏览器输入这 个组合单词,呵,有吧?见以下: Private Declare Function GetCursorPos Lib "user32" Alias "GetCursorPos" (lpPoint As POINTAPI) As Long 好了好了,高兴一下就算了,现在让我们分析一下这个 API,看其它的没啥不同的,其 中只有一个参数,就是最后一个变量有些不懂?在 VB中好像没有见过这个变量?不明白 么?那就再继续往下看。 lpPoint As POINTAPI,POINTAPI?很显然,在 VB中并没有此类型,一般都是 String、 Integer、Long、Byte等变量类型,那么这个也就理所当然的是自定义类型(问:什么是自定 义类型?答:不知道,自已不会看书啊)。既然是自定义类型,那么我们如何才能知道它是如 何定义的呢?这里也就不用你操心啦,还是 API浏览器,在最上面的 Combox中选择类型, 这时下面 List中也就自然的把 API的相关类型显示出来了,现在我们开始在 Text 文本框中 输入我们需要的自定义类型,POINTAPI,点击添加,出来了吧?如下: Private Type POINTAPI x As Long y As Long End Type 好了,现在开始写代码,添加一个 Timer控件,设置属性见以下: Interval = 100 Enabled = True 双击 Timer控件,转到代码环境中写入以下代码: Private Declare Function GetCursorPos Lib "user32" (lpPoint As POINTAPI) As Long Private Type POINTAPI x As Long y As Long End Type Private Sub Timer1_Timer() Dim lpPoint As POINTAPI GetCursorPos lpPoint Me.Caption = "X = " & lpPoint.x & " Y = " & lpPoint.y End Sub 好了,分析开始,紧张不?别紧张,没啥值得紧张的!见以下: Dim lpPoint As POINTAPI,申明一个 POINTAPI类型变量,我们学过自定义类型的朋友 都知道,一般使用自定义类型时都需要先申明一个相关的类型变量方可使用。 GetCursorPos lpPoint,这一步我不说你都知道,调用 API呗。通过这个 API获取鼠标指 针的相关信息。这里我们使用了自己声明的 lpPoint变量,那为啥要使用这个变量呢?这里 我们回过头来就前两节我们所分析的那样进行分析,可以看到 GetCursorPos所需要传递的 值,如果是Long,我们就传入整形数字,如果是 String,我们就传入字符串,这里是 POINTAPI, 所以理所当然是要传入 POINTAPI类型,但是!VB中的自定义类型不可以直接使用,所以 我们需要先声明一个相同类型的变量。不知道说了这么多你懂了没? Me.Caption = "X = " & lpPoint.x & " Y = " & lpPoint.y,最后一句,也就是用来显示当前 鼠标的坐标值的,我们通过声明的 lpPoint变量来获取相应的鼠标坐标值,如果你不懂,那 就请你先把 VB自定义类型这章学完再说。 这里关于 API的一些使用方法及范例就先介绍到这里,如果你还有耐心往下看下去的 话,那我们就接着往下聊! 四、如何慢慢提升自己的 API功力? 何为 API功力?其实没必要搞那么清楚,首先需要搞明白的就是,你应该知道在什么 环境下使用什么 API,实现哪些功能应该使用哪些 API!这才是我们需要的。 1、试着自己从小程序开始写起。 写小程序?对!在你写小程序时应该拣你最感兴趣的程序写,否则有可能你写到一半以 后会觉得自己这个程序写得毫无价值,简直是在浪费时间,最后到头来还是功亏一篑。这里 我拿什么当题材呢?我在这里也想了很久,最后还是决定选择一个注销Windows程序来做 题材(其实这是我当初学 API最想实现的功能)。 注销Windows也就是退出Windows(重启,关机等都一样,不都是退出的意思吗?),根 据表面意思在 API浏览器中输入 Exit(退出)Windows,看看有没有这个 API?这里提醒一下, 你在查找这个 API的时候还会看到 ExitWindowsEX这个 API,其实这两个 API实现的功能 一样,前者是用在 16位操作系统上,只不过在Win32位操作系统上一般都使用 ExitWindowsEX。所以这里就使用后者。API见以下: Private Declare Function ExitWindowsEx Lib "user32" Alias "ExitWindowsEx" (ByVal uFlags As Long, ByVal dwReserved As Long) As Long 看看里面的两个参数,ByVal uFlags As Long?这里我们需要传入一个整形数字,可是 应该传入什么数字呢?这里说下,API中的参数可以传入不同的值,不同的值从而导致产生 不同的结果。分析 API中参数应该传递哪些值其实是有技巧的,以后大家只要是看到参数 字符中包函 Flags字符的话那就说明该参数可以被传入一个或多个标志,并且大部分都是传 入 API常数(什么是 API常数就不用我说了吧)。说白话点,就是我们可以传入多个 API常量, 并且可以在 API浏览器中找到,当然,不一定所有的 API常数都可以在 API浏览器中找到, 不过大部分都可以。 在 API浏览器查 API常量时我前面就教过大家技巧,现在该是我们实践的时候了,分 析如下: Exit :头一个大写字符 E Windows:头一个大写字符 W Ex :头一个大写字符 E 组合 :EWE_ 好了,现在在 API浏览器的中常数中找找,咦?发现好像没有以 EWE开头的常数?? 只发现以 EWX开头的?现在先别着急,咱们回过头来再分析下,咱们是失败在最后一步 Ex上,这里我不得不否决我前面教过大家的技巧,但是又不能完全否决,出现这种情况时 就需要大家灵活运用API常数的分析法,可以看到 EWX最后一个X是以 Ex的X作结尾的, 以这种方法做 API常数开头的不止这一个,所以这里我特意留了一个陷阱,希望给大家带 来一些经验将来能够灵活运用。现在我把关机 uFlags所能用到的相关常数发上来,如下: Private Const EWX_FORCE = 4 Private Const EWX_LOGOFF = 0 Private Const EWX_REBOOT = 2 Private Const EWX_SHUTDOWN = 1 怎么样?看得懂吧? 英语 关于好奇心的名言警句英语高中英语词汇下载高中英语词汇 下载英语衡水体下载小学英语关于形容词和副词的题 稍微好一点基本上没问题。不过这里我还是要解释一番,照顾 新手嘛! EWX_FORCE 前面的 EWX_ 我就不说了,关键是看 _ 符号后面的,Force 单词翻译: 强制,强迫。人工在翻译一下(我英文不好,翻译错了请别见怪,呵呵 ^_^ ),意思是说:强 制执行 ExitWindowsEx API关机函数。不知道这样解释你能不能明白。那到底这个常数有什 么用呢?这里我们先回忆一下以前关机的时候,当Windows无法关闭某些窗口的时候就停 止继续关机了,最后还得把无法关闭的窗口手动关闭方可,现在,如果我们使用这个常数进 行关机,那Windows不管你窗口能不能关闭,直接强制关闭。希望你懂了。 EWX_LOGOFF 这个嘛,貌似组合单词,不可直接翻译,那样就不是那个意思了。Logout Off,是这样写吗?注销的意思。 EWX_REBOOT 不浪费时间了,直接说明意思:重新启动。 EWX_SHUTDOWN 关机。 至于第二个ByVal dwReserved As Long,为保留整形,一般为 0即可。至于为什么为 0, 大家可以到网上下载一些专门讲解API函数的电子书看看,里面有大部分API函数的详细讲 解。或者下载VS.MSDN看看,在MSDN中说Windows 2000/95/98/Me中此参数忽略,XP中是 指定关机消息说明。 最后看看这个API为Function声明,说明该函数有返回值,返回值为Long,MSDN中说: 如果执行成功,则返回非零,否则为零。 现在上面已经把这个关机API和相关参数常量都给你分析透了,你可别告诉我你还不知 道怎么写?好了,这里我们做一个定时注销程序,呵呵,虽然很简单,不过很多时候用得上 哦!在Form窗口上添加Timer控件,Interval 设置为 1000,Enabled 设置为 True。好了,代 码如下: Private Declare Function ExitWindowsEx Lib "user32" (ByVal uFlags As Long, ByVal dwReserved As Long) As Long Private Const EWX_LOGOFF = 0 Private Sub Timer1_Timer() Static i As Integer i = i + 1 Me.Caption = i '这一步纯粹是想看看当前已经执行到几秒了?可不要 If i = 10 Then '秒数判断,可以根据自己的需要进行运算 ExitWindowsEx EWX_LOGOFF, 0 End If End Sub 其实我都有点不想分析了,不过为了照顾大众,不得不说下,Static i As Integer 静态变 量(问:啥叫静态变量?答:我晕!),i = i + 1是每执行Timer一次i就加 1,Timer的interval设 置为 1000,1000为一秒,2000为二秒。。。。后面一个If i = 10 Then是判断当i=10以后,也就 是 10秒,就执行注销,这个时候你可别忘了保存好你的其它没有保存的文件哦,如果没保 存 资料 新概念英语资料下载李居明饿命改运学pdf成本会计期末资料社会工作导论资料工程结算所需资料清单 丢失的话偶不承担任何法律责任的。其实这里我们可以自己做一个,如可以写成这样: ExitWindowsEx EWX_LOGOFF Or EWX_FORCE, 0,其中用了Or运算,整体的意思是强制 Windows注销。这样理解就够了,只要能让你明白。 现在我又要说一下了,不说不行的!就是在API中使用 Or 运算,关于Or运算符VB书 中都有详细解释的,别告诉我你没看?没看马上去看!上面EWX_LOGOFF Or EWX_FORCE 的使用是把 注销 和 强制 进行Or位运算,对两个数值执行按位析取,这里涉及到二进制 运算,说多了你可能不明白(如果你还是想追根到底的想知道到底是怎么一回事的话,我也 没办法,给个网址你慢慢看http://book.csdn.net/bookfiles/110/1001103366.shtml),我就说简单 点的吧,以后如果你想组合两个API常数的功能,一般都是用 Or 进行运行的。如上面写的。 好了,保存其它文件,然后F5运行之,看着Form标题的数字慢慢添加,当为 10时, Windows开始注销。。。 小提示:在使用EWX_SHUTDOWN的时候你可能会感觉没有作用,主要是NT系统的安 全性提高,需要用其它API进行提升自己的权限才可以。关于如何提升应用程序权限请百度 一下。 2、先从一些最简单的 API开始 无疑自己试着写程序是最好的提升方法,学完一些知识以后自己试着写写,这样能让你 理解的更快更好,好了不说废话了,接着往下看。 最简单的 API,呵呵,哪些最简单呢?这个我也说不好,这样吧,咱们就从 Get(获取) 开始,那 Get什么呢?Window(窗口),还是从窗口下手吧,这样更接近我们日常的编程,谁 叫这是一个Windows操作系统呢?先列几个常用的 API: GetWindow、GetWindowDC、GetWindowLong、GetWindowRect、GetWindowRgn、 GetWindowsDirectory、GetWindowText、GetWindowThreadProcessId 还有很多,我就先列举几个简单点的,咱们就从这几个中间随便抽几个来讲讲吧。 先从 GetWindowText下手,大家就表面的意思进行理解下,Get(获取)Window(窗 口)Text(文本),Very Good!这个 API以前不错的,可以获取密码框中的密码,呵呵,说到这 里,我估计有些人开始兴奋起来了!那好,Follow Me! 新建一个 Form窗口,然后添加一个 CommandButton,Caption设置为:显示密码。接着 添加两个 TextBox,Text1属性设置:PasswordChar=*;Text=123456789,Text2的属性基本上 没有什么需要设置的,只需要把 Text 属性为空就可以了,它主要是用来帮助咱们显示出密 码的。好了,在 Form1代码框中填入以下代码: Private Declare Function GetWindowText Lib "user32" Alias "GetWindowTextA" (ByVal hwnd As Long, ByVal lpString As String, ByVal cch As Long) As Long Private Sub Command1_Click() Dim sBuffer As String sBuffer = Space(255) GetWindowText Text1.hwnd, sBuffer, 255 Text2.Text = sBuffer End Sub OK,F5运行,点击 Command1,怎么样?Text1中的密码字符显示在 Text2中了吧?你 可以再更改下 Text1中的密码,然后再点击 Command1试试。也许你觉得会多此一举,为何 不 Text2.Text=Text1.Text这样?如果真的这样的话看似简单,那你就学不到 API了。 又到了开始分析的时候了,打起精神来,先看第一句:Dim sBuffer As String,不用说, 声明一个字符串变量呗!接着看第二句:sBuffer = Space(255) 那这一句呢?有些人可能不 知道了,没事,我会仔细讲的。Space是 VB内置的字符串处理函数,VB中的帮助文件中 有说明: 开始 { 本示例使用 Space 函数来生成一个字符串,字符串的内容为空格,长度为指定的长度。 Dim MyString ' 返回 10 个空格的字符串。 MyString = Space(10) ' 将 10 个空格插入两个字符串中间。 MyString = "Hello" & Space(10) & "World" }结束 很显然,我这一句是要分配 255个空格字符串内存,为啥要用分配?这都是为后面所要用到 打定的基础。接着往下: GetWindowText Text1.hwnd, sBuffer, 255 这一步是关键,通过它来获取咱们想要的窗口 文本,看第一个参数,我前面讲过 hwnd一般都是需要传入句柄的,这时咱们传入了 Text1.hwnd(Text1控件的句柄),第二个参数,lpSting为字符串变量,所以这里咱们传入 sBuffer 字符串变量。最后一个 cch为 Long整形,所以理应传入数字,这里我们传入了 255。现在 又有人想问了,为什么需要这么传入值?貌似和以前的传入不一样?确实!一刚开始你可能 搞不懂,这时候我先讲讲大概的意思,我们用 GetWindowText来获取窗口中的文本,当获 取成功以后,理所当然会返回窗口中的字符串,但是当我们用这个 API进行获取时,必须 需要一个缓冲来保存我们所获取的字符串,你如果不信去试试把 sBuffer = Space(255)去掉, 后面的 255其实就是告诉这个 API我们缓冲字符串的大小,这里再告诉大家一个技巧,以 后只要是看见包函有 cch字符时,大部分都是输入相关类型的大小。 再附加一点,就里我说过,hwnd是用来传句柄的,你也可以传入其它窗口句柄,只要 其它窗口有文本,都是可以通过这个 API获取的。还有 Text2.Text = sBuffer其实是可以先把 sBuffer处理一下再传给 Text2.Text的,关于字符串处理这里不讲。 好了,分析结束,来个小提示:在Windows操作系统中,任何有句柄的东东都可被看 作为一个窗口。另外你可能会去试试 QQ的密码框,^_^ 这里我要告诉你一下,无法成功, 为什么无法成功呢?这是一个技术问题目前不提! 接着再来试试 GetWindowsDirectory,大家看表面意思吧!Get(获取)Windows(就是 Windows目录)Directory(目录),也就是获取咱们那个系统目录,如:C:\Windows。可能我的 Windows目录中在 C盘,而其它人的可能在 D盘、E盘也说不定,所以有的时候软件需要 这个 API进行获取操作系统具体的Windows目录。 好了,还是新建一个 标准 excel标准偏差excel标准偏差函数exl标准差函数国标检验抽样标准表免费下载红头文件格式标准下载 EXE,添加一个 CommandButton,属性 Caption=显示Windows 目录,OK,写入以下代码: Private Declare Function GetWindowsDirectory Lib "kernel32" Alias "GetWindowsDirectoryA" (ByVal lpBuffer As String, ByVal nSize As Long) As Long Private Sub Command1_Click() Dim sBuffer As String sBuffer = Space(255) GetWindowsDirectory sBuffer, 255 MsgBox "Windows目录在: " & sBuffer End Sub 分析!第一个 Dim sBuffer As String字符串变量,sBuffer = Space(255)缓冲字符串, GetWindowsDirectory sBuffer, 255这个和上面所讲的一样,最后一个参数 nSize为 Long整形, 所以传入数值,那传入什么数值呢?Size???当然是缓冲字符串大小了,以后遇到这个 nSize一般也是传入相关类型的大小的。MsgBox "Windows目录在: " & sBuffer,是用 MsgBox消息框显示出Windows目录的位置。 OK,恭喜你,你又会使用了一个 API,还要继续吗?(问:当然还要啦!答:最后一次 哦!) GetWindowThreadProcessId,这次玩玩窗口进程,我估计有些人只要看见与进程有关的 东东也会变得兴奋,呵呵!好了,先看看这个 API是什么样的?如下: Private Declare Function GetWindowThreadProcessId Lib "user32" Alias "GetWindowThreadProcessId" (ByVal hwnd As Long, lpdwProcessId As Long) As Long 看表面意思:Get(获取)Window(窗口)Thread(线程)Process(程序)Id(ID),组合:获取当前 线程的窗口进程 ID。至于进程 ID要着有什么用,自己以后深入 32编程就知道了。 看看参数,ByVal hwnd As Long,哈哈,熟悉吧,一个 hWnd句柄。lpdwProcessId As Long 这个就是咱们需要的进程 ID,老规矩,新建标准 EXE,添加一个 CommandButton,属性: Caption=获取窗口进程 ID。代码如下: Private Declare Function GetWindowThreadProcessId Lib "user32" (ByVal hwnd As Long, lpdwProcessId As Long) As Long Private Sub Command1_Click() Dim PID As Long GetWindowThreadProcessId Me.hwnd, PID MsgBox "窗口进程的 ID是:" & PID End Sub 我已经习惯了给大家分析了。首先看看第一个参数,ByVal hwnd As Long,又是句柄来 的(问:废话!答:教会了你也别这样啊),lpdwProcessId As Long,这个就要注意了,看看 这个参数的传递方式,是以 ByRef进行传递的(问:呵呵,不懂什么意思?答:不懂?转回 去看过程函数这章),也就是说 ByRef是以地址进行传递的,过程中可以改变传递的参数值。 明白了吗?还不明白的话回去乖乖看书吧!现在明白了传递方式,也就是说我们声明的 PID 是用来获取窗口进程 ID的,厉害啊。 F5,运行之,点击 Command1,PID出来了吧?没出来我马上从十楼跳下去。 温馨小提示^_^:hWnd可以传入其它窗口句柄,同样可以获取其它窗口进程 ID。 接下来我们再来看看 Set(设置),Set什么呢?当然还是Window(窗口)容易些,先列出几 个常用的 API: SetWindowLong、SetWindowPos、SetWindowRgn、SetWindowText 接上面的。 首先咱们先看 SetWindowText,咱们在上面讲过 GetWindowText这个 API, GetWindowText是用来获取窗口文本的,而这个正好相反。现在可以看看表面意思 Set(设 置)Window(窗口)Text(文本),好了这样理解就够了,我们已经知道这个 API是设置窗口文本 的,接着咱们就到 API浏览器中找找这个 API,如下: Private Declare Function SetWindowText Lib "user32" Alias "SetWindowTextA" (ByVal hwnd As Long, ByVal lpString As String) As Long 接着咱们看里面所需要传递的参数,一共有两,第一个 ByVal hwnd As Long我就不用 说了,传入句柄呗,第二个 ByVal lpString As String,其中声明的 lpString是字符串变量,可 想而知,这里需要传入字符串,好了,开始实践。新建一个标准 EXE,然后添加一个 TextBox 控件,然后再添加一个 CommandButton,写入以下代码: Private Declare Function SetWindowText Lib "user32" Alias "SetWindowTextA" (ByVal hwnd As Long, ByVal lpString As String) As Long Private Sub Command1_Click() SetWindowText Text1.hwnd, "这是咱们设置的文本" End Sub 呵呵,这个看似比前面的更简单,不过我还是要罗嗦一下,首先把 Text1的句柄传入第 一个参数,这样 API知道咱们需要操作哪个窗口,第二个是一个字符串变量,所以这里就 是我们需要传入的文本。好了,F5运行,点击 Command1,OK。 再看 SetWindowPos,可以说这个 API可以看成设置窗口位置,但是最终的实现效果取 决于咱们传递的参数,好了,在 API浏览器中找到这个 API,如下: Private Declare Function SetWindowPos Lib "user32" Alias "SetWindowPos" (ByVal hwnd As Long, ByVal hWndInsertAfter As Long, ByVal x As Long, ByVal y As Long, ByVal cx As Long, ByVal cy As Long, ByVal wFlags As Long) As Long 呵!好家伙,这个 API看起来有些复杂啊?不过别担心,有我在嘛,我会帮你好好分析 的,这里还请大家别光我一个人分析,必须把自己融入进来,咱们一起分析这样不更有趣? 好了,废话少说,先看第一个参数: ByVal hwnd As Long 这里我就不讲了,传入窗口句柄 ByVal hWndInsertAfter As Long 好了,看看这个!hwndInstrAfter,可以看到里面包函有 hwnd字符,这时你可能会说我前面不是已经说过嘛,只要看见包函有 hwnd字符的都应该 传入句柄嘛?呵呵,没错,你很聪明,记得我说的话呢!在这里夸一下你,别骄傲啊!现在 咱们好好分析一下这个地方应该传入哪些参数!打开MSDN,不好意思是英文,这里我就 把翻译过来的说明放上来,如下: hWndInsertAfter - Long,窗口句柄。在窗口列表中,窗口 hwnd会置于这个窗口句柄 的后面。也可能选用下述值之一: HWND_BOTTOM 将窗口置于窗口列表底部 HWND_TOP 将窗口置于 Z序列的顶部;Z序列代表在分级结构中,窗口针对一 个给定级别的窗口显示的顺序 HWND_TOPMOST 将窗口置于列表顶部,并位于任何最顶部窗口的前面 HWND_NOTOPMOST 将窗口置于列表顶部,并位于任何最顶部窗口的后面 可以看到这个地方有四个参数供我们选择,一般我们会使用第三个 API常数和第四个 API常数,这几个 API常数都可以在 API浏览器中找到,至于具体实现什么功能我相信大 家都知道吧,后面有写呢! 再看看后面的几个 x,y,cx,cy 分别为 Long变量,我上面讲过,SetWindowPos可以看成 设置窗口位置嘛,所以这里理所当然是传入相关的坐标值,如果忽略则为 0,自己可以试下。 ByVal wFlags As Long,这个参数,我又说过,看看字符 Flags,呵呵,熟悉吧,所以这里 咱们需要传入相关的标识常数,利用咱们以前学过的常数分析法进行分析, Set(S)Window(W)Pos(P)=SWP_ ,可以看到相关的常数了吧?这里我把相关常数的说明发上 来大家看下,如下: SWP_DRAWFRAME 围绕窗口画一个框 SWP_HIDEWINDOW 隐藏窗口 SWP_NOACTIVATE 不激活窗口 SWP_NOMOVE 保持当前位置(x和 y设定将被忽略) SWP_NOREDRAW 窗口不自动重画 SWP_NOSIZE 保持当前大小(cx和 cy会被忽略) SWP_NOZORDER 保持窗口在列表的当前位置(hWndInsertAfter将被忽略) SWP_SHOWWINDOW 显示窗口 SWP_FRAMECHANGED 强迫一条WM_NCCALCSIZE消息进入窗口,即使窗口的大 小没有改变 所以我说过,一个这样的 API他具体实现的功能取决于你所传递的参数。假设这里咱 们需要实现一个窗口永远置前的功能,首先新建一个标准 EXE,输入以下代码: Private Declare Function SetWindowPos Lib "user32" (ByVal hwnd As Long, ByVal hWndInsertAfter As Long, ByVal x As Long, ByVal y As Long, ByVal cx As Long, ByVal cy As Long, ByVal wFlags As Long) As Long Private Const HWND_TOPMOST = -1 Private Const SWP_NOMOVE = &H2 Private Const SWP_NOSIZE = &H1 Private Sub Form_Load() SetWindowPos Me.hwnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE Or SWP_NOSIZE End Sub 现在咱们开始分析,第一个参数传入句柄,第二个我上面讲过,实现什么功能传入什么 参数,这里咱们是实现的窗口永久置前的功能,所以传入 HWND_TOPMOST常数,现在看 看其实坐标,如果你不想改变窗口的具体位置的话,这里可不设为 0,再看看后面的 wFlags, 我传入了两个常数,这两个常数的相关说明请大家看看上面就知道,主要是不改变窗口位置 和不改变窗口大小的前提下把窗口置前,其它常数如果大家有兴趣可以自己试试。 最后一个,看看 SetWindowRgn,这里我要解释一番,这个 API所实现的功能呢就是改 变窗口外观,也就是咱们所说的异形窗口等,通过这个 API咱们可以把窗口改变成任何形 状,在 API浏览器找到这个 API,如下: Private Declare Function SetWindowRgn Lib "user32" Alias "SetWindowRgn" (ByVal hWnd As Long, ByVal hRgn As Long, ByVal bRedraw As Boolean) As Long 好了,第一个参数,句柄。第二个参数,Long变量,这里需要传入什么咱们下面会讲 到。第三个,Boolean变量,可以说明这里需要传入布尔值,Redraw为重画的意思,所以如 果我们用这个 API改变窗口形状,这里需要为 True,表示重画窗口。 现在新建一个标准 EXE,然后把 Form的 ScaleMode设置成 3-Pixel,我们知道Windows 是以像素为单位的,所以使用这个 API进行设置的时候是以像素为单位进行处理窗口外观。 然后把 BorderStyle设置为 0-None,这样看得更明显。好了,写入以下代码: Private Declare Function SetWindowRgn Lib "user32" (ByVal hWnd As Long, ByVal hRgn As Long, ByVal bRedraw As Boolean) As Long Private Declare Function CreateRoundRectRgn Lib "gdi32" (ByVal X1 As Long, ByVal Y1 As Long, ByVal X2 As Long, ByVal Y2 As Long, ByVal X3 As Long, ByVal Y3 As Long) As Long Private Sub Form_Load() Dim hRgn As Long hRgn = CreateRoundRectRgn(0, 0, Me.ScaleWidth, Me.ScaleHeight, 10, 10) SetWindowRgn Me.hWnd, hRgn, True End Sub 我不得不说一下这里我又用了一个 API,主要是因为使用 SetWindowRgn API是需要和 其它 API一起进行工作的,首先让我们先看看 CreateRoundRectRgn这个 API。分析如下: 整体的意思是:创建圆角矩形。这里提示大家一个技巧,一般 API中包函 Rgn字符的都 是代表可以改变对象外观的。可以看看我们使用的两个 API,一个是 SetWindowRgn(Rgn), 一个是 CreateRoundRectRgn(Rgn),希望你能明白其中的共同点。 参数:x1,y1,x2,y2,x3,y3这些都是坐标值,具体说明见以下: X1,Y1 ---------- Long,矩形左上角的 X,Y坐标 X2,Y2 ---------- Long,矩形右下角的 X,Y坐标 X3 ------------- Long,圆角椭圆的宽。其范围从 0(
本文档为【VB+API初级入门】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
下载需要: 免费 已有0 人下载
最新资料
资料动态
专题动态
is_960740
暂无简介~
格式:pdf
大小:229KB
软件:PDF阅读器
页数:0
分类:互联网
上传时间:2011-09-28
浏览量:14