




已阅读5页,还剩3页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
LabVIEW调用Windows API实现VI窗口置顶前些天同事用LabVIEW开发了个常用的小工具软件,碍于电脑屏幕太小,想让这小工具一直保持在所有窗口的最顶端(置顶),几个人讨论研究发现通过LabVIEW的属性节点只能实现VI程序在LabVIEW软件中保持最前,而在其他窗口没能置顶,未能达到想要的效果。通过上网查找资料,软件置顶是与操作平台的控制相关,需要调用Windows API去实现这功能,研究了一下,调用Windows API能很好的实现了VI置顶。百度上用LabVIEW调用Windows API的教程LabVIEW版本比较旧,为方便大家更好的学习,现将自己研究的方法分享出来。 一.什么是Windows APIWindows 这个多作业系统除了协调应用程序的执行、分配内存、管理资源之外, 它同时也是一个很大的服务中心,调用这个服务中心的各种服务(每一种服务就是一个函数),可以帮应用程序达到开启视窗、描绘图形、使用周边设备等目的,由于这些函数服务的对象是应用程序(Application), 所以便称之为 Application Programming Interface,简称 API 函数。WIN32 API也就是Microsoft Windows 32位平台的应用程序编程接口。Windows API包括几千个可调用的函数,它们大致可分为以下几类:基本服务、组件服务、用户界面服务、图形多媒体服务、消息和协作、网络、Web服务。二Windows API的发展现状当WINDOWS操作系统开始占据主导地位的时候,开发WINDOWS平台下的应用程序成为人们的需要。而在WINDOWS程序设计领域处于发展的初期,WINDOWS程序员所能使用的编程工具唯有API函数,这些函数是WINDOWS提供给应用程序与操作系统的接口,他们犹如“积木块”一样,可以搭建出各种界面丰富,功能灵活的应用程序。所以可以认为API函数是构筑整个WINDOWS框架的基石,在它的下面是WINDOWS的操作系统核心,而它的上面则是所有的华丽的WINDOWS应用程序。程序员想编写具有Windows风格的软件,必须借助API,API也因此被赋予至高无上的地位。但是,如若没有合适的Windows编程平台,那么Windows开发是一项很复杂的工作。在可视化编程IDE出来之前,那时的WINDOWS程序开发还是比较复杂的工作,程序员必须熟记一大堆常用的API函数,而且还得对WINDOWS操作系统有深入的了解。然而随着软件技术的不断发展,在WINDOWS平台上出现了很多优秀的可视化编程环境,程序员可以采用“所见即所得”的编程方式来开发具有精美用户界面和功能强大的应用程序。这些优秀可视化编程环境操作简单、界面友好(诸如VB、VC+、DELPHI等),在这些工具中提供了大量的类库和各种控件,它们替代了API的神秘功能,事实上这些类库和控件都是构架在WIN32 API函数基础之上的,是封装了的API函数的集合。它们把常用的API函数的组合在一起成为一个控件或类库,并赋予其方便的使用方法,所以极大的加速了WINDOWS应用程序开发的过程。有了这些控件和类库,程序员便可以把主要精力放在程序整体功能的设计上,而不必过于关注技术细节。实际上如果我们要开发出更灵活、更实用、更具效率的应用程序,必然要涉及到直接使用API函数,虽然类库和控件使应用程序的开发简单的多,但它们只提供WINDOWS的一般功能,对于比较复杂和特殊的功能来说,使用类库和控件是非常难以实现的,这时就需要采用API函数来实现。这也是API函数使用的场合,所以我们对待API函数不必刻意去研究每一个函数的用法,那也是不现实的(能用得到的API函数有几千个呢)。正如某位大虾所说:API不要去学,在需要的时候去查API帮助就足够了。三LabVIEW怎么去调用Windows API上面介绍已经讲了API是一个操作系统与应用程序的接口函数,LabVIEW作为一个程序开发平台(环境)同样可以调用Windows API函数去实现应用程序的多功能化。应用程序窗口置顶属于窗口效果控制,需要先获取当前窗口句柄,然后再去设置其他API函数的参数。获取当前窗口句柄的Windows API函数是FindWindowA,我们就先拿这个函数进行讲解如何实现LabVIEW调用API。调用前,需要对此函数进行一个详细的了解,可以利用WindowsAPI查询器查得此函数的介绍,也可以通过百度百科获得,对比发现百度百科比较全面,这里选百度百科的介绍。表1.函数FindWindowA函数名FindWindowA函数原型int32_t FindWindowA(int32_t lpClassName, CStr lpWindowName);功能描述检索处理顶级窗口的类名和窗口名称匹配指定的字符串输入参数1lpClassName:String,指向一个以null结尾的、用来指定类名的字符串。(注:使用时将此参数设置为Long型,直接赋常量0)输入参数2lpWindowName:String,指向一个以null结尾的、用来指定窗口名(即窗口标题)的字符串。如果此参数为NULL,则匹配所有窗口名。输出参数无返回值Long,如果函数执行成功,则返回值是拥有指定窗口类名或窗口名的窗口的句柄。如果函数执行失败,则返回值为 NULL 。FindWindowA这个函数在user32.dll这个动态库里面。dll是动态链接库(Dynamic Link Library)。DLL是一个包含可由多个程序,同时使用的代码和数据的库。使用DLL更容易地将更新应用于各个模块,而不会影响该程序的其他部分。user32.dll这个动态库的路径一般在C:WindowsSystem32user32.dl 。有了以上信息就可以开始用LabVIEW调用FindWindowA这个API函数了。新建一个VI,后面板点开函数面板,在 互连接口-库与可执行程序-调用库函数节点,如图1。图1 调用库函数节点面板路径图点击后在后面板出现,利用即时帮助可查看此节点的简单介绍,如右图2。图2 调用库函数节点简介双击此函数节点,出现调用库函数窗口,按标号依次选择和设置,1.选择dll库路径:C:WindowsSystem32user32.dl ;2.选择调用的函数名FindWindowA;3.在调用规范中选stdcall(WINAPI); 如图3所示。 图3 调用库函数路径和函数选择设置完函数面板,1.点击参数;2.将类型设为数值,如图4。 图4 返回类型值设置同一个面板1.按添加参数按钮;2.在输入参数名称:IpClassName;3.选择参数类型为:字符串;如图5所示。图5 添加参数并设置名称和类型同一个面板1.按添加参数按钮;2.在输入参数名称:IpWindowName;3.选择参数类型为:字符串;如图6所示。图6 添加参数2设置名称和类型到此API函数FindWindowA的调用设置结束,按确认后得到通过创建输入输出控件可知其结构,具体如下图7所示。图7 各引线参数名四调用API函数实现VI窗口置顶实现窗口置顶需要调用FindWindowA、GetWindowLongA、SetWindowLongA、SetWindowPos共四个API函数。整个调用流程由右图所示。四个API函数都在user32.dll动态库里面可以找到,详细的设置这里不再赘述。下面是除FindWindowA函数其它三个函数的参数介绍。表2.函数GetWindowLongA函数名GetWindowLongA函数原型int32_t GetWindowLongA(int32_t hWnd, int32_t nIndex);功能描述该函数获得有关指定窗口的信息,函数也获得在额外窗口内存中指定偏移位地址的32位度整型值。输入参数1hWnd:Long,窗口句柄及间接给出的窗口所属的窗口类。输入参数2nlndex:Long,指定要获得值的大于等于0的值的偏移量。有效值的范围从0到额外窗口内存空间的字节数减4。其值可以是下面几种:GWL_EXSTYLE:(-20)获得扩展窗口风格;GWL_HINSTANCE:(-6)获得应用实例的句柄;GWL_HWNDPARENT:(-8)如果父窗口存在,获取父窗口句柄;GWL_ID:(-16)获得窗口标识;GWL_STYLE:(-16)获得窗口风格;GWL_USERDATA:(-21)获得与窗口有关的32位值。每一个窗口均有一个由创建该窗口的应用程序使用的32位值。GWL_WNDPROC:(-4)获得窗口过程的地址,或代表窗口过程的地址的句柄。输出参数无返回值Long,如果函数执行成功,则返回值是拥有指定窗口类名或窗口名的窗口的句柄。如果函数执行失败,则返回值为 NULL 。表3.函数SetWindowLongA函数名SetWindowLongA函数原型int32_t SetWindowLongA(int32_t hWnd, int32_t nIndex, int32_t dwNewLong);功能描述该函数用来改变指定窗口的属性函数也将指定的一个32位值设置在窗口的额外存储空间的指定偏移位置。输入参数1hWnd:Long,窗口句柄及间接给出的窗口所属的类。输入参数2nlndex:Long,指定将设定的大于等于0的偏移值。有效值的范围从0到额外类的存储空间的字节数减4。其值可以是以下几种:GWL_EXSTYLE:(-20)设定一个新的扩展风格。GWL_HINSTANCE:(-6)设置一个新的应用程序实例句柄。GWL_ID:(-12)设置一个新的窗口标识符。GWL_STYLE:(-16)设定一个新的窗口风格。GWL_USERDATA:(-21)设置与窗口有关的32位值。每个窗口均有一个由创建该窗口的应用程序使用的32位值。GWL_WNDPROC:(-4)为窗口过程设定一个新的地址。GWL_HWNDPARENT:(-8)改变子窗口的父窗口,应使用SetParent函数。输入参数3dwNewLong:Long,由nIndex指定的窗口信息的新值。其值可以是一下几种:LVS_ICON:大图标显示;LVS_SMALLICON:小图标显示;LVS_LIST:列表显示;LVS_REPORT:详细报表显示。输出参数无返回值Long,如果函数执行成功,则返回值是拥有指定窗口类名或窗口名的窗口的句柄。如果函数执行失败,则返回值为 NULL 。表4.函数SetWindowPos函数名SetWindowPos函数原型int32_t SetWindowPos(int32_t hWnd, int32_t hWndInsertAfter, int32_t x, int32_t y, int32_t cx, int32_t cy, int32_t wFlags);功能描述为窗口指定一个新位置和状态。它也可改变窗口在内部窗口列表中的位置。输入参数1hWnd:Long,窗口句柄及间接给出的窗口所属的窗口类。输入参数2hWndlnsertAfter:Long,在z序中的位于被置位的窗口前的窗口句柄。该参数必须为一个窗口句柄,其值可以是一下几种:HWND_BOTTOM:()将窗口置于窗口列表底部。HWND_TOP:(0)将窗口置于Z序列的顶部;Z序列代表在分级结构中,窗口针对一个给定级别的窗口显示的顺序。HWND_TOPMOST:(-1)将窗口置于列表顶部,并位于任何最顶部窗口的前面。HWND_NOTOPMOST:(-2)将窗口置于列表顶部,并位于任何最顶部窗口的后面。输入参数3x:Long,窗口新的x坐标。输入参数4y:Long,窗口新的y坐标。输入参数5cx:Long,指定新的窗口宽度。输入参数6cy:Long,指定新的窗口高度。输入参数7wFlags:Long,窗口尺寸和定位的标志。其值可以是一下几种:SWP_NOSIZE:(1)保持当前大小(cx和cy会被忽略)SWP_NOMOVE:(2)保持当前位置(x和y设定将被忽略)SWP_NOZORDER:(4)不改变Z序列(忽略hWndInsertAfter参数)SWP_SHOWWINDOW:(16)显示窗口SWP_HIDEWINDOW:(64)隐藏窗口SWP_NOACTIVATE:(128)不激活窗口输出参数无返回值Long,如果函数执行成功,
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
评论
0/150
提交评论