下载

2下载券

加入VIP
  • 专属下载特权
  • 现金文档折扣购买
  • VIP免费专区
  • 千万文档免费下载

上传资料

关闭

关闭

关闭

封号提示

内容

首页 VB_API入门教程

VB_API入门教程.doc

VB_API入门教程

等待黎明
2010-07-12 0人阅读 举报 0 0 暂无简介

简介:本文档为《VB_API入门教程doc》,可适用于IT/计算机领域

VBAPI入门教程接受网友的意见写了一篇关于VBAPI的文章希望大家能从中学到一些知识。一、API是什么?  这个我本来不想说的不过也许你知道其它人不知道这里为了照顾一下新手不得不说些废话请大家谅解。  WinAPI即为Microsoft位平台的应用程序编程接口(Application ProgrammingInterface)。所有在Win平台上运行的应用程序都可以调用这些函数。  使用WinAPI应用程序可以充分挖掘Windows的位操作系统的潜力。Mircrosoft的所有位平台都支持统一的API包括函数、结构、消息、宏及接口。使用WinAPI不但可以开发出在各种平台上都能成功运行的应用程序而且也可以充分利用每个平台特有的功能和属性。  以上为API的相关介绍不过有些新手看了以后可能还是不怎么明白API到底有什么用?这里请不要着急如果你有足够耐心的话请慢慢往下看。二、如何使用API?  估计这才是大家真正关心的那么如何使用API呢?在了解API之前先打开你的VB书翻到过程函数这章来在搞清楚API之前应该先搞懂过程函数是怎么一回事!如果你还不知道过程的工作方式那么请先不要急着往下看那样容易走很多弯路。好了当你理解了过程函数时也就是你可以使用API的时候了别把API看得太难你就像使用过程函数一样使用API就可以了。首先让我们看看一个简单的API以下:PrivateDeclareSubSleepLib"kernel"Alias"Sleep"(ByValdwMillisecondsAsLong)  以上这个API的呢是起一个延时作用。你如果是刚接触API的话可能会感到API的书写及其复杂而且会感到很不适应。其实这没什么的慢慢习惯就好了。至于API这些复杂的书写你就不用操心了在你安装VB的时候微软已经帮我们带上了API浏览器这些全部都可以利用API浏览器帮我们自动生成。API浏览器的位置位于开始菜单-程序-MicrosoftVisualBasic中文版-MicrosoftVisualBasic中文版工具-API文本浏览器。打开API浏览器在最上面的一个文本框中输入Sleep这时下面列表框中就会自动显示相应的API函数然后点右边添加按钮即可接着点击复制按钮这时你就可以用CtrlV把声明的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我们要申明第五个单词kerneldLL中的API一般写DLL名称时都要用双引号括起来如"user"、"shelldll"等至于后面的dll这个可以带可不带。再来看第六个Alias这个也是需要同后面一个一起用的我们应该把第六个和第七个连起来一起看Alias"Sleep"这个意思表示将被调用的过程在DLL中还有另外的名称这个是可选的。最后括号里面的也就是和过程函数一样你传入相应的值就可以了。上面我们分析完API函数声明以后接着我们就要自己动手写代码了。先把这个API复制到Form代码窗口中然后写如下代码:PrivateDeclareSubSleepLib"kernel"(ByValdwMillisecondsAsLong)PrivateSubFormLoad()SleepEndSub  解释一下也就是在窗体启动时使用SleepAPI进行延时秒后面的参数dwMilliseconds是表示你要延时的秒数基本上和设置Timer中的秒数一样。你再看一下Sleep 的使用方式是不是和使用VB过程函数一样呢?好了我们的第一个VBAPI程序写完了可以看到使用API并不是一件很难的事。三、如何才能提升你对API的学习兴趣?  API我常把它看做成过程函数不过每人都有每人的见解和理解方式自己的理解方式只要可以帮助自己更好的学习和掌握API也没必要一定要学习他人的。  ,自己做MsgBox了解API参数的使用方法是很重要的这里我们不用VB的MsgBox直接使用API弹出MsgBox消息框。首先打开API浏览器选择MessageBox大家可以用这个API和VB内置的MsgBox比较一下其实MsgBox也就是MessageBox的缩写只不过一个是API一个是VB内置的但两者都是通过API进行工作的。好了选择私有声明方式粘贴到VB代码编辑窗口中然后新建一个CommandButton写入以下代码:PrivateDeclareFunctionMessageBoxLib"user"Alias"MessageBoxA"(ByValhwndAsLong,ByVallpTextAsString,ByVallpCaptionAsString,ByValwTypeAsLong)AsLongPrivateSubCommandClick()MessageBoxMehwnd,"这里是内容","标题",EndSub  先让我们来分析一下首先看第一个参数ByvalhWndAsLong很显然这是一个长整形变量所以我们这里需要传递的是数字你可能会发现我们传递的并不是数字啊而是Mehwnd??很奇怪是吗?如果你真的有此疑问说明你是真心想要学习好API的现在就让我们来看看Mehwnd到底是什么东西?以下摘自VB帮助文档:  hWnd属性:返回窗体或控件的句柄。  句柄:是由操作环境定义的一个唯一的整数值它被程序用来标识或者切换到对象如窗体或控件等。  现在估计你差不多就已经明白了我们调用的hwnd其实是一个句柄整数值你可以用MsgboxMehwnd 看一下就知道了。至于Me这是一个关键字代表当前Form窗体对象。如:MeCaption="标题"、MeBackColor=vbRed等。(“printMehwnd”输出不关掉窗体每次相同关掉重新运行后不同)  接上面的首先我们传入了Mehwnd表示是当前窗口调用MessageBox这里告诉大家一个技巧也就是以后凡是看到ByvalhwndAsLong一般都是需要传入句柄的至于传入哪个对象句柄那就要看你是怎么实现的了。  ByVallpTextAsString这个是字符串变量标识着叫我们需要传入字符串进去可以看里面的变量字符lpText,属于文本的意思也就是说是用来显示MsgBox中的消息文本的。  ByVallpCaptionAsString也是字符串变量还是传入字符串进去。在看里面的变量字符lpCaption其实就是显示MsgBox标题的。  ByValwTypeAsLong这是一个整形变量需要传递整形数字还是看里面的变量字符wType标识着显示MsgBox类型这里可以像VB的MsgBox一样使用如这里可以传入:vbYesNo,vbOkCancel等如果忽略那就传入即可。  好了按F启动程序点击Command接着就会弹出一个消息框这里我们制作以及分析MsgBox已经完成了。希望你能在这段学习到一些知识。  ,来点实用的吧就拿隐藏Windows任务管理器来说吧这里只能隐藏任务管理器中的窗口不能隐藏进程。(问:有没有隐藏进程的答:你想干什么?)当程序运行后你无法从任务管理器的窗口中关闭程序只能从进程中进行终止。好了还是老规矩打开API浏览器输入GetWindow和ShowWindow两个API,声明范围还是私有的复制粘贴到Form代码窗口中嗯好了?别急还是API浏览器选择Combox中的常数输入GWOWNER和SWHIDE这两个API常数然后粘贴到代码窗口中问我这两个是干什么的?那就接着往下看吧。写入以下代码:PrivateDeclareFunctionGetWindowLib"user"(ByValhwndAsLong,ByValwCmdAsLong)AsLongPrivateDeclareFunctionShowWindowLib"user"(ByValhwndAsLong,ByValnCmdShowAsLong)AsLongPrivateConstGWOWNER=PrivateConstSWHIDE=PrivateSubFormLoad()DimlphWndAsLonglphWnd=GetWindow(Mehwnd,GWOWNER)ShowWindowlphWnd,SWHIDEEndSub  又到了分析的时候了这对刚入门的新手可谓是最激动的时候了。好了还是老子看看两个API的表面意思和传递值变量。  先看GetWindow,表面意思:获取窗口。传递值变量:hWnd整形句柄wCmd整形命令值。  再看ShowWindow表面意思:显示窗口。传递值变量:hWnd整形句柄nCmdShow整形命令值。  然后是使用代码先看lphWnd=GetWindow(Mehwnd,GWOWNER)这句这句意思是获取当前窗口的所有者窗口句柄(“printMehwnd”输出不关掉窗体每次相同关掉重新运行后不同)。。。(“printlphwnd”输出不关掉窗体每次相同关掉重新运行每次输出也相同)可以看到GetWindow是Function过程函数执行以后会返回相应的窗口句柄值这个值为Long整形(同句柄)。接着调用ShowWindowlphWnd,SWHIDE这句意思是显示lphwnd这个句柄的窗口关键一句是最后的SWHIDE,这是API函数的常量。通过设置常量能让系统知道API到底应该怎么执行显示窗口是显示?还是隐藏?Hide当然是隐藏的意思。好了编译成Exe运行后打开任务管理器查看程序窗口还有吗?  我又要说一下了有些人可能不懂为什么要用GWOWNER这些常量这些到底有什么用?还有就是我怎么知道哪些API对应哪些的常量?其实这些常量你只要稍微注意一下就知道它们是怎么回事了如在GetWindow中我使用GWOWNER在ShowWindow中我使用SWHIDE这些常量都有一个共同的特点就是他们都是以API的单词第一个字母为标准。如GetWindow相对应的常量就是Get(G)Window(W)=GWShowWindow相对应的常就是Show(S)Window(W)=SW这些常量可以自己在VB的API浏览器中找找看。(讲了这么多还是没讲常量到底有什么作用呵GWOWNER寻找窗口所有者SWHIDE隐藏窗口活动状态给另一个窗口)  继续往下学吧。。上面两个我们讲到了一般API的使用方法和一些API常量的使用方法接着我们来看看API类型的使用方法在了解这一小节前请先搞懂VB中的自定义类型(Type)这章否则你可能会稀里糊涂的到时别怪我没提醒你哦!这次让我们来获取一下鼠标指针的位置。这里教大家一个技巧当你想用API去实现某一特定的功能时却又不知道该用哪个API这时你可以就表面的意思到API浏览器找找有以上的机率可以找到哦!现在就拿这个API开刀那我们应该如何找?别着急往下看:如我们现在要获取鼠标指针位置可以这样翻译一下:Get(获取)Cursor(指针)Pos(位置)组合起来:GetCursorPos呵呵一条API就这样出来了到API浏览器输入这个组合单词呵有吧?见以下:PrivateDeclareFunctionGetCursorPosLib"user"Alias"GetCursorPos"(lpPointAsPOINTAPI)AsLong好了好了高兴一下就算了现在让我们分析一下这个API看其它的没啥不同的其中只有一个参数就是最后一个变量有些不懂?在VB中好像没有见过这个变量?不明白么?那就再继续往下看。lpPointAsPOINTAPIPOINTAPI?很显然在VB中并没有此类型一般都是String、Integer、Long、Byte等变量类型那么这个也就理所当然的是自定义类型(问:什么是自定义类型?答:不知道,自已不会看书啊)。既然是自定义类型那么我们如何才能知道它是如何定义的呢?这里也就不用你操心啦还是API浏览器在最上面的Combox中选择类型这时下面List中也就自然的把API的相关类型显示出来了现在我们开始在Text文本框中输入我们需要的自定义类型POINTAPI点击添加出来了吧?如下:PrivateTypePOINTAPIxAsLongyAsLongEndType好了现在开始写代码添加一个Timer控件设置属性见以下:Interval=Enabled=True双击Timer控件转到代码环境中写入以下代码:PrivateDeclareFunctionGetCursorPosLib"user"(lpPointAsPOINTAPI)AsLongPrivateTypePOINTAPIxAsLongyAsLongEndTypePrivateSubTimerTimer()DimlpPointAsPOINTAPIGetCursorPoslpPointMeCaption="X="lpPointx"Y="lpPointyEndSub好了分析开始紧张不?别紧张没啥值得紧张的!见以下:DimlpPointAsPOINTAPI申明一个POINTAPI类型变量我们学过自定义类型的朋友都知道一般使用自定义类型时都需要先申明一个相关的类型变量方可使用。GetCursorPoslpPoint这一步我不说你都知道调用API呗。通过这个API获取鼠标指针的相关信息。这里我们使用了自己声明的lpPoint变量那为啥要使用这个变量呢?这里我们回过头来就前两节我们所分析的那样进行分析可以看到GetCursorPos所需要传递的值如果是Long我们就传入整形数字如果是String我们就传入字符串这里是POINTAPI所以理所当然是要传入POINTAPI类型但是!VB中的自定义类型不可以直接使用所以我们需要先声明一个相同类型的变量。不知道说了这么多你懂了没?MeCaption="X="lpPointx"Y="lpPointy最后一句也就是用来显示当前鼠标的坐标值的我们通过声明的lpPoint变量来获取相应的鼠标坐标值如果你不懂那就请你先把VB自定义类型这章学完再说。这里关于API的一些使用方法及范例就先介绍到这里如果你还有耐心往下看下去的话那我们就接着往下聊!四、如何慢慢提升自己的API功力?何为API功力?其实没必要搞那么清楚首先需要搞明白的就是你应该知道在什么环境下使用什么API实现哪些功能应该使用哪些API!这才是我们需要的。,试着自己从小程序开始写起。写小程序?对!在你写小程序时应该拣你最感兴趣的程序写否则有可能你写到一半以后会觉得自己这个程序写得毫无价值简直是在浪费时间最后到头来还是功亏一篑。这里我拿什么当题材呢?我在这里也想了很久最后还是决定选择一个注销Windows程序来做题材(其实这是我当初学API最想实现的功能)。注销Windows也就是退出Windows(重启关机等都一样不都是退出的意思吗?)根据表面意思在API浏览器中输入Exit(退出)Windows看看有没有这个API?这里提醒一下你在查找这个API的时候还会看到ExitWindowsEX这个API其实这两个API实现的功能一样前者是用在位操作系统上只不过在Win位操作系统上一般都使用ExitWindowsEX。所以这里就使用后者。API见以下:PrivateDeclareFunctionExitWindowsExLib"user"Alias"ExitWindowsEx"(ByValuFlagsAsLong,ByValdwReservedAsLong)AsLong看看里面的两个参数ByValuFlagsAsLong?这里我们需要传入一个整形数字可是应该传入什么数字呢?这里说下API中的参数可以传入不同的值不同的值从而导致产生不同的结果。分析API中参数应该传递哪些值其实是有技巧的以后大家只要是看到参数字符中包函Flags字符的话那就说明该参数可以被传入一个或多个标志并且大部分都是传入API常数(什么是API常数就不用我说了吧)。说白话点就是我们可以传入多个API常量并且可以在API浏览器中找到当然不一定所有的API常数都可以在API浏览器中找到不过大部分都可以。在API浏览器查API常量时我前面就教过大家技巧现在该是我们实践的时候了分析如下:Exit:头一个大写字符EWindows:头一个大写字符WEx:头一个大写字符E组合:EWE好了现在在API浏览器的中常数中找找咦?发现好像没有以EWE开头的常数??只发现以EWX开头的?现在先别着急咱们回过头来再分析下咱们是失败在最后一步Ex上这里我不得不否决我前面教过大家的技巧但是又不能完全否决出现这种情况时就需要大家灵活运用API常数的分析法可以看到EWX最后一个X是以Ex的X作结尾的以这种方法做API常数开头的不止这一个所以这里我特意留了一个陷阱希望给大家带来一些经验将来能够灵活运用。现在我把关机uFlags所能用到的相关常数发上来如下:PrivateConstEWXFORCE=PrivateConstEWXLOGOFF=PrivateConstEWXREBOOT=PrivateConstEWXSHUTDOWN=怎么样?看得懂吧?英语稍微好一点基本上没问题。不过这里我还是要解释一番照顾新手嘛!EWXFORCE前面的EWX我就不说了关键是看符号后面的,Force单词翻译:强制强迫。人工在翻译一下(我英文不好翻译错了请别见怪呵呵^^)意思是说:强制执行ExitWindowsExAPI关机函数。不知道这样解释你能不能明白。那到底这个常数有什么用呢?这里我们先回忆一下以前关机的时候当Windows无法关闭某些窗口的时候就停止继续关机了最后还得把无法关闭的窗口手动关闭方可现在如果我们使用这个常数进行关机那Windows不管你窗口能不能关闭直接强制关闭。希望你懂了。EWXLOGOFF这个嘛貌似组合单词不可直接翻译那样就不是那个意思了。LogoutOff是这样写吗?注销的意思。EWXREBOOT不浪费时间了直接说明意思:重新启动。EWXSHUTDOWN关机。至于第二个ByValdwReservedAsLong为保留整形一般为即可。至于为什么为,大家可以到网上下载一些专门讲解API函数的电子书看看里面有大部分API函数的详细讲解。或者下载VSMSDN看看在MSDN中说WindowsMe中此参数忽略XP中是指定关机消息说明。最后看看这个API为Function声明说明该函数有返回值返回值为LongMSDN中说:如果执行成功则返回非零否则为零。现在上面已经把这个关机API和相关参数常量都给你分析透了你可别告诉我你还不知道怎么写?好了这里我们做一个定时注销程序呵呵虽然很简单不过很多时候用得上哦!在Form窗口上添加Timer控件Interval设置为Enabled设置为True。好了代码如下:PrivateDeclareFunctionExitWindowsExLib"user"(ByValuFlagsAsLong,ByValdwReservedAsLong)AsLongPrivateConstEWXLOGOFF=PrivateSubTimerTimer()StaticiAsIntegeri=iMeCaption=i'这一步纯粹是想看看当前已经执行到几秒了?可不要Ifi=Then'秒数判断可以根据自己的需要进行运算ExitWindowsExEWXLOGOFF,EndIfEndSub其实我都有点不想分析了不过为了照顾大众不得不说下StaticiAsInteger静态变量(问:啥叫静态变量?答:我晕!)i=i是每执行Timer一次i就加,Timer的interval设置为为一秒为二秒。。。。后面一个Ifi=Then是判断当i=以后也就是秒就执行注销这个时候你可别忘了保存好你的其它没有保存的文件哦如果没保存资料丢失的话偶不承担任何法律责任的。其实这里我们可以自己做一个如可以写成这样:ExitWindowsExEWXLOGOFFOrEWXFORCE,其中用了Or运算整体的意思是强制Windows注销。这样理解就够了只要能让你明白。现在我又要说一下了不说不行的!就是在API中使用Or运算关于Or运算符VB书中都有详细解释的别告诉我你没看?没看马上去看!上面EWXLOGOFFOrEWXFORCE的使用是把注销和强制进行Or位运算对两个数值执行按位析取这里涉及到二进制运算说多了你可能不明白(如果你还是想追根到底的想知道到底是怎么一回事的话我也没办法给个网址你慢慢看http:bookcsdnnetbookfilesshtml)我就说简单点的吧以后如果你想组合两个API常数的功能一般都是用Or进行运行的。如上面写的。好了保存其它文件然后F运行之看着Form标题的数字慢慢添加当为时Windows开始注销。。。小提示:在使用EWXSHUTDOWN的时候你可能会感觉没有作用主要是NT系统的安全性提高需要用其它API进行提升自己的权限才可以。关于如何提升应用程序权限请百度一下。,先从一些最简单的API开始无疑自己试着写程序是最好的提升方法学完一些知识以后自己试着写写这样能让你理解的更快更好好了不说废话了接着往下看。最简单的API呵呵哪些最简单呢?这个我也说不好这样吧咱们就从Get(获取)开始那Get什么呢?Window(窗口)还是从窗口下手吧这样更接近我们日常的编程谁叫这是一个Windows操作系统呢?先列几个常用的API:GetWindow、GetWindowDC、GetWindowLong、GetWindowRect、GetWindowRgn、GetWindowsDirectory、GetWindowText、GetWindowThreadProcessId还有很多我就先列举几个简单点的咱们就从这几个中间随便抽几个来讲讲吧。先从GetWindowText下手大家就表面的意思进行理解下Get(获取)Window(窗口)Text(文本)VeryGood!这个API以前不错的可以获取密码框中的密码呵呵说到这里我估计有些人开始兴奋起来了!那好FollowMe!新建一个Form窗口然后添加一个CommandButtonCaption设置为:显示密码。接着添加两个TextBoxText属性设置:PasswordChar=*Text=Text的属性基本上没有什么需要设置的只需要把Text属性为空就可以了它主要是用来帮助咱们显示出密码的。好了在Form代码框中填入以下代码:PrivateDeclareFunctionGetWindowTextLib"user"Alias"GetWindowTextA"(ByValhwndAsLong,ByVallpStringAsString,ByValcchAsLong)AsLongPrivateSubCommandClick()DimsBufferAsStringsBuffer=Space()GetWindowTextTexthwnd,sBuffer,TextText=sBufferEndSubOKF运行点击Command怎么样?Text中的密码字符显示在Text中了吧?你可以再更改下Text中的密码然后再点击Command试试。也许你觉得会多此一举为何不TextText=TextText这样?如果真的这样的话看似简单那你就学不到API了。又到了开始分析的时候了打起精神来先看第一句:DimsBufferAsString不用说声明一个字符串变量呗!接着看第二句:sBuffer=Space()那这一句呢?有些人可能不知道了没事我会仔细讲的。Space是VB内置的字符串处理函数VB中的帮助文件中有说明:开始{本示例使用Space函数来生成一个字符串字符串的内容为空格长度为指定的长度。DimMyString'返回个空格的字符串。MyString=Space()'将个空格插入两个字符串中间。MyString="Hello"Space()"World"}结束很显然我这一句是要分配个空格字符串内存为啥要用分配?这都是为后面所要用到打定的基础。接着往下:GetWindowTextTexthwnd,sBuffer,这一步是关键通过它来获取咱们想要的窗口文本看第一个参数我前面讲过hwnd一般都是需要传入句柄的这时咱们传入了Texthwnd(Text控件的句柄)第二个参数lpSting为字符串变量所以这里咱们传入sBuffer字符串变量。最后一个cch为Long整形所以理应传入数字这里我们传入了。现在又有人想问了为什么需要这么传入值?貌似和以前的传入不一样?确实!一刚开始你可能搞不懂这时候我先讲讲大概的意思我们用GetWindowText来获取窗口中的文本当获取成功以后理所当然会返回窗口中的字符串但是当我们用这个API进行获取时必须需要一个缓冲来保存我们所获取的字符串你如果不信去试试把sBuffer=Space()去掉后面的其实就是告诉这个API我们缓冲字符串的大小这里再告诉大家一个技巧以后只要是看见包函有cch字符时大部分都是输入相关类型的大小。再附加一点就里我说过hwnd是用来传句柄的你也可以传入其它窗口句柄只要其它窗口有文本都是可以通过这个API获取的。还有TextText=sBuffer其实是可以先把sBuffer处理一下再传给TextText的关于字符串处理这里不讲。好了分析结束来个小提示:在Windows操作系统中任何有句柄的东东都可被看作为一个窗口。另外你可能会去试试QQ的密码框^^这里我要告诉你一下无法成功为什么无法成功呢?这是一个技术问题目前不提!接着再来试试GetWindowsDirectory大家看表面意思吧!Get(获取)Windows(就是Windows目录)Directory(目录)也就是获取咱们那个系统目录如:C:Windows。可能我的Windows目录中在C盘而其它人的可能在D盘、E盘也说不定所以有的时候软件需要这个API进行获取操作系统具体的Windows目录。好了还是新建一个标准EXE添加一个CommandButton属性Caption=显示Windows目录OK写入以下代码:PrivateDeclareFunctionGetWindowsDirectoryLib"kernel"Alias"GetWindowsDirectoryA"(ByVallpBufferAsString,ByValnSizeAsLong)AsLongPrivateSubCommandClick()DimsBufferAsStringsBuffer=Space()GetWindowsDirectorysBuffer,MsgBox"Windows目录在:"sBufferEndSub分析!第一个DimsBufferAsString字符串变量sBuffer=Space()缓冲字符串GetWindowsDirectorysBuffer,这个和上面所讲的一样最后一个参数nSize为Long整形所以传入数值那传入什么数值呢?Size???当然是缓冲字符串大小了以后遇到这个nSize一般也是传入相关类型的大小的。MsgBox"Windows目录在:"sBuffer是用MsgBox消息框显示出Windows目录的位置。OK恭喜你你又会使用了一个API还要继续吗?(问:当然还要啦!答:最后一次哦!)GetWindowThreadProcessId这次玩玩窗口进程我估计有些人只要看见与进程有关的东东也会变得兴奋呵呵!好了先看看这个API是什么样的?如下:PrivateDeclareFunctionGetWindowThreadProcessIdLib"user"Alias"GetWindowThreadProcessId"(ByValhwndAsLong,lpdwProcessIdAsLong)AsLong看表面意思:Get(获取)Window(窗口)Thread(线程)Process(程序)Id(ID)组合:获取当前线程的窗口进程ID。至于进程ID要着有什么用自己以后深入编程就知道了。看看参数ByValhwndAsLong哈哈熟悉吧一个hWnd句柄。lpdwProcessIdAsLong这个就是咱们需要的进程ID,老规矩新建标准EXE添加一个CommandButton,属性:Caption=获取窗口进程ID。代码如下:PrivateDeclareFunctionGetWindowThreadProcessIdLib"user"(ByValhwndAsLong,lpdwProcessIdAsLong)AsLongPrivateSubCommandClick()DimPIDAsLongGetWindowThreadProcessIdMehwnd,PIDMsgBox"窗口进程的ID是:"PIDEndSub我已经习惯了给大家分析了。首先看看第一个参数ByValhwndAsLong又是句柄来的(问:废话!答:教会了你也别这样啊)lpdwProcessIdAsLong这个就要注意了看看这个参数的传递方式是以ByRef进行传递的(问:呵呵不懂什么意思?答:不懂?转回去看过程函数这章)也就是说ByRef是以地址进行传递的过程中可以改变传递的参数值。明白了吗?还不明白的话回去乖乖看书吧!现在明白了传递方式也就是说我们声明的PID是用来获取窗口进程ID的厉害啊。F运行之点击CommandPID出来了吧?没出来我马上从十楼跳下去。温馨小提示^^:hWnd可以传入其它窗口句柄同样可以获取其它窗口进程ID。接下来我们再来看看Set(设置)Set什么呢?当然还是Window(窗口)容易些先列出几个常用的API:SetWindowLong、SetWindowPos、SetWindowRgn、SetWindowText接上面的。首先咱们先看SetWindowText咱们在上面讲过GetWindowText这个APIGetWindowText是用来获取窗口文本的而这个正好相反。现在可以看看表面意思Set(设置)Window(窗口)Text(文本)好了这样理解就够了我们已经知道这个API是设置窗口文本的接着咱们就到API浏览器中找找这个API如下:PrivateDeclareFunctionSetWindowTextLib"user"Alias"SetWindowTextA"(ByValhwndAsLong,ByVallpStringAsString)AsLong接着咱们看里面所需要传递的参数一共有两第一个ByValhwndAsLong我就不用说了传入句柄呗第二个ByVallpStringAsString其中声明的lpString是字符串变量可想而知这里需要传入字符串好了开始实践。新建一个标准EXE然后添加一个TextBox控件然后再添加一个CommandButton,写入以下代码:PrivateDeclareFunctionSetWindowTextLib"user"Alias"SetWindowTextA"(ByValhwndAsLong,ByVallpStringAsString)AsLongPrivateSubCommandClick()SetWindowTextTexthwnd,"这是咱们设置的文本"EndSub呵呵这个看似比前面的更简单不过我还是要罗嗦一下首先把Text的句柄传入第一个参数这样API知道咱们需要操作哪个窗口第二个是一个字符串变量所以这里就是我们需要传入的文本。好了F运行点击CommandOK。再看SetWindowPos可以说这个API可以看成设置窗口位置但是最终的实现效果取决于咱们传递的参数好了在API浏览器中找到这个API如下:PrivateDeclareFunctionSetWindowPosLib"user"Alias"SetWindowPos"(ByValhwndAsLong,ByValhWndInsertAfterAsLong,ByValxAsLong,ByValyAsLong,ByValcxAsLong,ByValcyAsLong,ByValwFlagsAsLong)AsLong呵!好家伙这个API看起来有些复杂啊?不过别担心有我在嘛我会帮你好好分析的这里还请大家别光我一个人分析必须把自己融入进来咱们一起分析这样不更有趣?好了废话少说先看第一个参数:ByValhwndAsLong这里我就不讲了传入窗口句柄ByValhWndInsertAfterAsLong好了看看这个!hwndInstrAfter可以看到里面包函有hwnd字符这时你可能会说我前面不是已经说过嘛只要看见包函有hwnd字符的都应该传入句柄嘛?呵呵没错你很聪明记得我说的话呢!在这里夸一下你别骄傲啊!现在咱们好好分析一下这个地方应该传入哪些参数!打开MSDN不好意思是英文这里我就把翻译过来的说明放上来如下:hWndInsertAfterLong窗口句柄。在窗口列表中窗口hwnd会置于这个窗口句柄的后面。也可能选用下述值之一:HWNDBOTTOM将窗口置于窗口列表底部HWNDTOP将窗口置于Z序列的顶部Z序列代表在分级结构中窗口针对一个给定级别的窗口显示的顺序HWNDTOPMOST将窗口置于列表顶部并位于任何最顶部窗口的前面HWNDNOTOPMOST将窗口置于列表顶部并位于任何最顶部窗口的后面可以看到这个地方有四个参数供我们选择一般我们会使用第三个API常数和第四个API常数这几个API常数都可以在API浏览器中找到至于具体实现什么功能我相信大家都知道吧后面有写呢!再看看后面的几个x,y,cx,cy分别为Long变量我上面讲过SetWindowPos可以看成设置窗口位置嘛所以这里理所当然是传入相关的坐标值如果忽略则为,自己可以试下。ByValwFlagsAsLong,这个参数我又说过看看字符Flags呵呵熟悉吧所以这里咱们需要传入相关的标识常数利用咱们以前学过的常数分析法进行分析Set(S)Window(W)Pos(P)=SWP可以看到相关的常数了吧?这里我把相关常数的说明发上来大家看下如下:SWPDRAWFRAME围绕窗口画一个框SWPHIDEWINDOW隐藏窗口SWPNOACTIVATE不激活窗口SWPNOMOVE保持当前位置(x和y设定将被忽略)SWPNOREDRAW窗口不自动重画SWPNOSIZE保持当前大小(cx和cy会被忽略)SWPNOZORDER保持窗口在列表的当前位置(hWndInsertAfter将被忽略)SWPSHOWWINDOW显示窗口SWPFRAMECHANGED强迫一条WMNCCALCSIZE消息进入窗口即使窗口的大小没有改变所以我说过一个这样的API他具体实现的功能取决于你所传递的参数。假设这里咱们需要实现一个窗口永远置前的功能首先新建一个标准EXE输入以下代码:PrivateDeclareFunctionSetWindowPosLib"user"(ByValhwndAsLong,ByValhWndInsertAfterAsLong,ByValxAsLong,ByValyAsLong,ByValcxAsLong,ByValcyAsLong,ByValwFlagsAsLong)AsLong PrivateConstHWNDTOPMOST= PrivateConstSWPNOMOVE=H PrivateConstSWPNOSIZE=H PrivateSubFormLoad() SetWindowPosMehwnd,HWNDTOPMOST,,,,,SWPNOMOVEOrSWPNOSIZE EndSub现在咱们开始分析第一个参数传入句柄第二个我上面讲过实现什么功能传入什么参数这里咱们是实现的窗口永久置前的功能所以传入HWNDTOPMOST常数现在看看其实坐标如果你不想改变窗口的具体位置的话这里可不设为再看看后面的wFlags我传入了两个常数这两个常数的相关说明请大家看看上面就知道主要是不改变窗口位置和不改变窗口大小的前提下把窗口置前其它常数如果大家有兴趣可以自己试试。最后一个看看SetWindowRgn这里我要解释一番这个API所实现的功能呢就是改变窗口外观也就是咱们所说的异形窗口等通过这个API咱们可以把窗口改变成任何形状在API浏览器找到这个API如下:PrivateDeclareFunctionSetWindowRgnLib"user"Alias"SetWindowRgn"(ByValhWndAsLong,ByValhRgnAsLong,ByValbRedrawAsBoolean)AsLong好了第一个参数句柄。第二个参数Long变量这里需要传入什么咱们下面会讲到。第三个Boolean变量可以说明这里需要传入布尔值Redraw为重画的意思所以如果我们用这个API改变窗口形状这里需要为True表示重画窗口。现在新建一个标准EXE然后把Form的ScaleMode设置成Pixel我们知道Windows是以像素为单位的所以使用这个API进行设置的时候是以像素为单位进行处理窗口外观。然后把BorderStyle设置为None这样看得更明显。好了写入以下代码:PrivateDeclareFunctionSetWindowRgnLib"user"(ByValhWndAsLong,ByValhRgnAsLong,ByValbRedrawAsBoolean)AsLongPrivateDeclareFunctionCreateRoundRectRgnLib"gdi"(ByValXAsLong,ByValYAsLong,ByValXAsLong,ByValYAsLong,ByValXAsLong,ByValYAsLong)AsLongPrivateSubFormLoad()DimhRgnAsLonghRgn=CreateRoundRectRgn(,,MeScaleWidth,MeScaleHeight,,)SetWindowRgnMehWnd,hRgn,TrueEndSub我不得不说一下这里我又用了一个API主要是因为使用SetWindowRgnAPI是需要和其它API一起进行工作的首先让我们先看看CreateRoundRectRgn这个API。分析如下:整体的意思是:创建圆角矩形。这里提示大家一个技巧一般API中包函Rgn字符的都是代表可以改变对象外观的。可以看看我们使用的两个API一个是SetWindowRgn(Rgn)一个是CreateRoundRectRgn(Rgn),希望你能明白其中的共同点。参数:x,y,x,y,x,y这些都是坐标值具体说明见以下:X,YLong矩形左上角的XY坐标X,YLong矩形右下角的XY坐标XLong圆角椭圆的宽。其范围从(没有圆角)到矩形宽(全圆)YLong圆角椭圆的高。其范围从(没有圆角)到矩形高(全圆)所以上面的代码具体是先通过CreateRoundRectRgn创建一个圆角矩形对象然后通过SetWindowRgn来改变窗口的外观。小提示:使用CreateRoundRectRgn可以创建圆角矩形也可以使用CreateEllipticRgn创建椭圆形CreatePolyPolygonRgn创建多边形CreateRectRgn矩形等细心观察它们最后三个字符Rgn呵呵明白了吧。获取其它窗口的句柄这个我本来打算不讲的不过网友们既然提出来了我也只好详细说说。一般获取其它窗口的句柄使用以下API:FindWindowFindWindowExWindowFromPoint这两个API就足矣先看看第一个API的原型:PrivateDeclareFunctionFindWindowLib"user"Alias"FindWindowA"(ByVallpClassNameAsString,ByVallpWindowNameAsString)AsLong里面一共有两个参数先看第一个:ByVallpClassNameAsString,字符串变量所以这里需要传入字符串第二个ByVallpWindowNameAsString同样一个字符串变量这里也需要传入字符串。再看这个API为Function有返回值的那返回值就是我们需要的句柄了。好了现在了解了两个参数的具体传递类型那我们现在就要知道这两个参数中到底应该传入哪些值?如下:ByVallpClassNameAsStringlpClassName:类名。指窗口类名如果忽略则传入vbString。ByVallpWindowNameAsString,lpWindowName:

用户评价(0)

关闭

新课改视野下建构高中语文教学实验成果报告(32KB)

抱歉,积分不足下载失败,请稍后再试!

提示

试读已结束,如需要继续阅读或者下载,敬请购买!

文档小程序码

使用微信“扫一扫”扫码寻找文档

1

打开微信

2

扫描小程序码

3

发布寻找信息

4

等待寻找结果

我知道了
评分:

/18

VB_API入门教程

VIP

在线
客服

免费
邮箱

爱问共享资料服务号

扫描关注领取更多福利