说三道四技术文摘-感悟人生的经典句子
说三道四 > 文档快照

VB如何提高调用WINDOWS API函数编程技巧

HTML文档下载 WORD文档下载 PDF文档下载
VB如何提高调用WINDOWS API函数编程技巧
石油大学(北京)
顾岱鸿
---- 做为一个不断进取的编程者,我们常常不满足于编程语言所提供的一般功能,总是希望能够实现一些特殊的功能,这有时不但是我们程序的要求,有时也是编程者心理上需要(试想,还会有什么比在深夜中巧妙解决一个难题而更令人兴奋呢?)。VisualBasic,做为一个当前最流行的快速编程环境,就给我们提供了实现这些目标的平台,事实上,它无限扩展的API接口可以实现所有WINDOWS下可以实现的功能。然而对于初学者来说,"浩瀚"的API函数总是显得那么神奇与不可琢磨,因此在实际应用过程中不能够灵活应用。下面我将结合两个小例子来示范介绍VB中调用API函数的步骤和功能,并总结说明在实际工作中如何提高这方面的技巧。例子在WINDOWS98下采用VB6.0编译。

一.限制鼠标的移动
---- 有时我们的软件要求用户在未完成某一任务时,鼠标不能移出当前活动控件,换句话就是将鼠标限制在控件的内部,直到任务完成或用户中断为止。这个功能借助API函数实现起来思路很清楚,代码也很简洁。其思路是先确定当前鼠标的位置;然后确定当前活动控件的大小;最后将鼠标限制在活动控件内。(下面忽略项目建立等过程)
---- 1.建立一个新项目:新窗体为form1,在form1上添加一个commandbutton,设置其Name=CMButton1;Caption="将鼠标限制在此按钮中"

---- 2.拷贝API函数和POINTAPI结构:打开VB6.0自带的API浏览器,调入WIN32API.txt文件,复制以下结构和函数声明到form1的声明部分:

Private Type RECT
Left As Long
Top As Long
Right As Long
Bottom As Long
End Type
Private Type POINTAPI
x As Long
y As Long
End Type

Private Declare Function ClientToScreen Lib
"user32" Alias "ClientToScreen" (ByVal
hwnd As Long, lpPoint As POINTAPI) As Long
'用来确定当前鼠标的位置

Private Declare Function ClipCursor Lib
"user32" Alias "ClipCursor" (lpRect As Any)
As Long '用来限定当前鼠标的活动范围

---- 3.定义一个通用过程ConfineTo
Public Sub ConfineTo (myCtl As Object)
On Error Resume Next
Dim tmpRect As RECT
Dim pt As POINTAPI

With myCtl
If TypeOf myCtl Is Screen Then '锁定在屏幕范围内
tmpRect.Left = 0
tmpRect.Top = 0
tmpRect.Right = (.Width \ Screen.TwipsPerPixelX)
tmpRect.Bottom = (.Height \ Screen.TwipsPerPixelY)
Elseif TypeOf myCtl Is form '锁定在窗体范围内
tmpRect.Left = (.Left \ Screen.TwipsPerPixelX)
tmpRect.Top = (.Top \ Screen.TwipsPerPixelY)
tmpRect.Right = (.Left + .Width) \ Screen.TwipsPerPixelX
tmpRect.Bottom = (.Top + .Height) \ Screen.TwipsPerPixelY
else
pt.X = 0
pt.Y = 0
Call ClientToScreen(.hWnd, pt)
'获取当前控件在屏幕上的位置
tmpRect.Left = pt.X
'保存当前控件位置
tmpRect.Top = pt.Y
pt.X = .Width
pt.Y = .Height
Call ClientToScreen(.hWnd, pt)
tmpRect.Bottom = pt.Y
tmpRect.Right = pt.X
End If
Call ClipCursor(tmpRect)
End With
End Sub

---- 4.在 CMButton1_Click()中加入以下代码
Static Cliped As Boolean
'静态变量用来控制状态切换
If Not Cliped Then
ConfineTo Cmbutton1
Cliped = True
Else
ConfineTo Screen '取消鼠标限制
Cliped = True
End If

---- 5. 运行后,鼠标点击cmbutton1,此时鼠标只能被锁定在此按钮内部,再次点击按钮,限制取消。
二.创建临时文件
---- 临时文件用来保存软件运行过程中的临时变化,这对于熟悉WORD等软件的人来说,经常会遇到。那么临时文件是如何产生的呢,其实很简单,只需要一个API函数就可以。
---- 1.拷贝声明函数(方法同前)

Private Declare Function GetTempFileName Lib "kernel32" _
Alias "GetTempFileNameA" (ByVal lpszPath As String, _
ByVal lpPrefixString As String, ByVal wUnique As Long, _
ByVal lpTempFileName As String) As Long
参数定义如下:
lpszPath =传入保存临时文件的路径 ,如"C:\mytemp"
lpPrefixString=传入临时文件名开始的前三个字母,
起到帮助识别临时文件来源的作用。
wUnique =0 ,windows随机产生文件名;否则安其值定义文件名。
lpTempFileName=返回随机文件名

---- 2.返回临时文件名
Private Function GenTempName(sPath As String)
Dim sPrefix As String
Dim lUnique As Long
Dim sTempFileName As String

If IsEmpty(sPath) Then sPath = "c:\temp"
sPrefix = "TVB"
lUnique = 0 'windows随机给名

sTempFileName = Space$(100)
GetTempFileName sPath, sPrefix, lUnique, sTempFileName
sTempFileName = Mid$(sTempFileName, 1,
InStr(sTempFileName, Chr$(0)) - 1) '去掉多余空格
GenTempName = sTempFileName
End Function

---- 3.将下面代码加入到form1_click()事件中
MsgBox GenTempName("c:\temp")

---- 4.运行,鼠标点击form,弹出msgbox,显示生成"c:\temp\TVB724.tmp"文件,用文件管理器查看,在c:\temp下有TVB724.tmp 文件,长度为0K。
---- 需要注意的是,传入的路径必须是有效路径,否则GenTempName函数返回0,lpTempFileName中也没有临时文件名。

三.结束语
---- 从上面可以看出,API函数的确简单高效,但也充满一些看似高深的变量而使人却步。我们不禁会问,究竟什么时候要用到API函数?具体哪些函数可以解决我的问题?,那些函数中的变量都代表什么?其实对这些问题,即使对一个VB高手也难给出明确的回答,因为API函数库实在太庞大了,每一个人最终只能熟悉其中的一小部分(这也可能是调用API的文章层出不穷的原因吧)。总结自己的一点经验,我觉得应该注意以下几点。
---- 1.熟练掌握VB基本技巧,了解其所能所不能,这是最基本的要求。

---- 2.了解WINDOWS内部控制机理,这样对一些复杂的问题就可以逐步分析其调用机制,初步确定采用哪部分的API函数来解决问题。

---- 3.案头必备一本最新的VB版的WINDOWS API 大全,推荐机械工业出版社的<>。书中给出了每一个VB可以调用的API函数的详细说明,可以帮助精确了解所需要的API函数的变量声明。

---- 4.多看别人的程序。报纸杂志,尤其是网上这方面的文章数不清。这是最快的方法。

---- 5.随用随查。永远不要在用不到的函数上浪费宝贵的时间
成功的社区在于拥抱变化——知乎创始人周源专访 优化UITableViewCell高度计算的那些事 国外iOS大牛:开发Apple Watch应用我犯过的错 云上Java System Profiling与Debugging——蚂蚁金服观察与实践 搜狗商业平台Java技术实践 Java在电信软件领域的技术实战 关于Java框架Vert.x的几点思考 Java在游戏服务器开发中的应用 Java框架研发思考 那些年,Java程序员用过的开发工具 Java内存模型的历史变迁 Java 8与Apache Ignite Java开发与技术挑战——关于技术的技术思考 专访唯品会架构师肖桦:做编码的架构师 越来越“简单”的Java 我的Java!越过山丘 专访沙梓社:做个“Think Different”的技术牛人 基于ES6,使用React、Webpack、Babel构建模块化JavaScript应用 财税街创始人石克清:创业须空杯心态+有效社交 自我知识管理:连贯性就是生产率 玩转Google I/O 2015:Android M、IoT、Glass 2.0、VR、ATAP ARC中Retain Cycle揭秘 失控与逆转!企业移动化2.0时代下如何求变? 玩转物联网之MQTT 专访都灵创客教育奚炎:被忽视的Maker教育 13岁iOS开发者:Swift开发Sprite Kit游戏实践 专访豌豆荚「自动装」开发团队:无需Root即可批量点击「下一步」 iOS项目的持续集成与管理 《近匠》谛听科技,探索智慧家庭的智能网关 【简讯】Python 3.5.0b1发布 《算法的乐趣》作者王晓华访谈:多看、多做、多想是秘诀 彩色图像的亮度和对比度? HTML Help Workshop 话中国电影的英文译名(英语爱好者请进,更新中) 小弟做的第一个网页,知道来这个论坛的都是高手,请大家多批评! 如何从CObject中派生一个类? 初学请求大家帮助希望早结贴早睡觉(两贴共120分)。 菜鸟问题:应该先学开发平台还是先学开发语言? service是否也有消息队列? 不知道这样的情况,SQL语句该如何写!谢谢了! HTML Help Workshop 安装什么样的版本? iis无缘无故死掉??? c#.net ! Delphi程序员现在的工资怎么样啊? 如何取得Button的Text属性值? 歪脚鸭病了 一个想了很久的问题,C/C++为什么把声明与实现放在不同的文件里(*.h,*.cpp),感觉没有一点好处。 郁闷,散分! 关于scjp的一个很菜的问题 请问为什么我的两千上网后不能关机? 哈!又升级了!(版主要手下留情,我是真心感谢大家) 现在再看《人月神话》有价值吗? 有关生成可执行文件的问题 水源里的兄弟们进来说说,到底怎样才能渡自己早日成星呀? 请教:怎样在一个应用程序中提取经运算的 多行文本行 有关new操作的问题 我要学c#.net,该从那开始??难吗??谢谢指教啊~~~~~ 两个小问题 请教:怎样在一个应用程序中提取经运算的 多行文本行 如何读取一个目录下所有目录? 如何测出电话不通时返回得声音(占线声),它的具体代码?我要做一个占线自动重拨的程序! 我的插入代码为什么不能执行!? 声卡资源的分配??帮帮我!!! 怪事多多!IE窗口无法“还原” 我的代码怎么发不上去? msdn不知为什么运行不好了,要运行两次才行,速度很慢! 一个播放器,如何判断它要播放的是视频文件还是音频文件? 我在银行工作,请推荐一些关于UNIX和informix online的好书,如何学习? 为什么我的ftp别人不能上? 有下载版的精华贴子吗? 大家帮忙啊。 2002总结 运行jb8注册机JBLicenseGen.exe时出错,谁知道什么回事,错误代码如下 给一般按钮加上Tooltip的问题请教??? 水晶表可否控制列的显示?就是有的列显示!有的不显示 表单不能等待怎么办? (转贴) 一只人文主义狗—史努比 娇情的夜晚 已经知道文件的位置是:http://myhome.com/files/my.txt,如何用java实现自动下载? 一千个孬种加起来<一个天才? 不知道是不是? 关于刻录机和Nero,很奇怪,望玩刻录机的高手解答。 浙江二批招生上周结束 省内高校招办主浙江教育厅出新政 每年15%中小学名浙江省高校国际化发展年度报告出炉“考神笔记”走俏 浙江理科状元笔记被今年9月杭州部分中小学校长有变动逐梦高职(图)浙高考第三批分数线公布 文科271分737所在浙招生的第二批高校投档线公制作版画(图)浙江四所初中自报100%减负 被教育浙江省教育厅通报全省减负工作暗访情况杭城公办小学录取结束 爆棚的“一表生浙江高考文理科第二批首轮投档分数线今浙江省教育厅公布暗访情况 四所学校减浙江民办小升初招生结束 杭州部分学校浙江教育厅:明年仍坚持民办初中招生不浙大教授陈英旭受审 亿元课题经费被控天热,补习更热,暑假惨成“第三学期”浙江省教育厅:全省已有79个县实现“大学专业冷热变迁昔日最热的计算机、法北大清华在浙高考录取结束 两校共录取兰山民警拾万金不昧还失主 被称最美警2016年“京博梦·大学生助学”活动黑龙江启动四级干旱灾害应急响应南航新疆执行飞行波音777朝觐包机暑期打工被司机滞留 四川宜宾翠屏区送乌鲁木齐:生态立市打造经济增长绿色引湖北打伤八旬老汉村支书被撤职 公安已首架“重庆造”飞机NH40(CG23长白山讷殷古城9月底正式开放“帅府论坛—张学良与西安事变”学术研乌鲁木齐县今年新建改造1100多亩设辽宁葫芦岛三处人文景观首登《长城》特辽宁东戴河从严整肃旅游市场秩序新疆工会系统金秋助学 提高困难职工子2016南国书香节暨羊城书展闭幕 图海口市遥逍村附近南渡江有人溺水如果湖人给科比立雕像,这5个姿势你帮仇和被控受贿2433万余元 当庭表示发改委回应“创业投资进入寒冬”:是回金立群:亚投行将提升私人资本参与基础男子在街头直播示爱马蓉 被路过大汉揍
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn 说三道四技术文摘