在VB中调用API函数动态改变及恢复屏幕设

合集下载

VBA中调用API函数的方法和技巧

VBA中调用API函数的方法和技巧

VBA中调用API函数的方法和技巧VBA(Visual Basic for Applications)是一种用于微软Office应用程序的编程语言,它提供了许多强大的功能和工具,可以增强Office程序的自动化和扩展性。

在VBA中,调用API函数是一种常见的方式,可以让我们使用计算机系统提供的底层功能,以实现更高级的操作。

本文将介绍VBA中调用API函数的方法和技巧,以帮助您更好地使用VBA进行编程。

1. 了解API函数的基本概念API(Application Programming Interface)是一组定义了程序之间交互方式的规范。

通过调用API函数,我们可以利用操作系统或其他程序提供的功能,而无需自己编写底层代码。

VBA中的API函数是以动态链接库(DLL)的形式提供的,这些DLL文件通常包含了许多函数和过程,可以供我们进行调用。

2. 查找所需的API函数在VBA中调用API函数之前,我们需要先找到需要使用的API函数及其所属的DLL文件。

可以通过以下几种方式来查找:- 在Microsoft的官方文档中查找:Microsoft提供了许多API函数的文档,可以在其网站上找到对应的函数说明和示例代码。

- 在互联网上搜索:许多技术论坛和网站都提供了关于API函数的使用方法和示例代码。

可以通过搜索引擎来寻找相关的资源。

- 使用API查找工具:有一些第三方工具可以帮助我们查找API函数及其所属的DLL文件。

例如,Dependency Walker是一个常用的工具,可以查看DLL文件中包含的函数和模块。

3. 声明API函数在VBA中调用API函数之前,我们需要先声明这些函数,以告诉编译器它们的名称、参数和返回值的类型。

声明API函数的语法如下:```vbaPrivate Declare Function 函数名 Lib "DLL文件名" (参数列表) As 返回值类型```其中,函数名是API函数的名称,DLL文件名是包含该函数的DLL文件的名称,参数列表是函数的参数及其类型,返回值类型是函数的返回值类型。

vb api函数使用手册

vb api函数使用手册

vb api函数使用手册一、简介VB(Visual Basic)是一种基于事件驱动的编程语言,广泛应用于Windows操作系统上的应用程序开发。

VB提供了强大的API (Application Programming Interface)函数库,可以用于访问操作系统的各种功能和资源。

本文将介绍一些常用的VB API函数及其使用方法。

二、API函数分类VB API函数可以分为以下几类:1.窗口和控件操作这类API函数可以用于创建、操纵和管理窗口和控件,以及处理窗口消息和事件。

- CreateWindowEx:创建一个具有扩展样式的窗口。

- SetWindowText:设置窗口标题文字。

- ShowWindow:显示或隐藏一个窗口。

- SendMessage:向窗口发送消息。

- GetWindowRect:获取窗口的客户区矩形。

2.文件和目录操作这类API函数可以用于访问、读写和管理文件和目录。

- CreateFile:创建或打开一个文件。

- ReadFile:从文件读取数据。

- WriteFile:将数据写入到文件。

- FindFirstFile/FindNextFile:查找文件。

- CreateDirectory:创建一个目录。

3.系统和进程操作这类API函数可以用于访问和管理操作系统和进程的信息。

- GetTickCount:获取系统启动后的毫秒数。

- GetSystemInfo:获取系统的硬件和配置信息。

- CreateProcess:创建一个新的进程。

- TerminateProcess:终止一个进程。

- EnumProcesses:枚举所有正在运行的进程。

4.网络通信这类API函数可以用于实现网络通信功能,如创建、连接和通信等。

- socket:创建一个套接字用于网络通信。

- bind:将套接字与一个本地地址绑定。

- connect:连接到一个远程地址。

- send/recv:发送和接收数据。

VBA调用系统API函数的方法与实例说明

VBA调用系统API函数的方法与实例说明

VBA调用系统API函数的方法与实例说明VBA(Visual Basic for Applications)是一种基于Microsoft Visual Basic语言的宏编程语言,主要用于操作Microsoft Office软件中的各种功能。

尽管VBA本身提供了丰富的功能,但有时候我们可能需要调用操作系统的API函数来实现一些高级或特定的功能。

本文将详细介绍VBA调用系统API函数的方法,并提供一些实例说明。

在VBA中调用系统API函数可以拓展VBA的功能,并且提供了解决复杂问题的能力。

使用API函数可以与操作系统进行交互,访问底层功能和资源。

以下是一些常用的VBA调用系统API函数的方法:1. 声明API函数在使用API函数之前,我们需要在VBA中声明该函数。

声明API函数的语法如下:```Declare Function 函数名 Lib "库名称" ([alias]] [参数列表]) [返回值类型]```其中,函数名是要调用的API函数的名称,Lib是API 函数所在的库名称,参数列表是API函数的输入参数,返回值类型是API函数的返回值类型。

2. 调用API函数一旦我们声明了API函数,就可以在VBA代码中调用该函数。

调用API函数的语法如下:```变量名 = 函数名([参数列表])```其中,变量名是接收API函数返回值的变量名,函数名是已声明的API函数的名称,参数列表是传递给API函数的参数列表。

3. 释放资源在调用API函数之后,我们需要确保适当地释放相关资源以避免内存泄漏。

可以使用相关的API函数来释放资源,如CloseHandle函数释放句柄资源。

现在让我们通过几个实例来说明如何在VBA中调用系统API函数:1. 调用MessageBox函数MessageBox函数用于显示一个包含指定消息和按钮的模态对话框,并返回用户的操作。

下面的代码演示了如何在VBA中调用MessageBox函数:```vbaDeclare Function MessageBox Lib "user32" Alias "MessageBoxA" (ByVal hWnd As Long, _ByVal lpText As String, ByVal lpCaption As String, ByVal uType As Long) As LongSub ShowMessageBox()Dim prompt As StringDim title As StringDim result As Longprompt = "这是一个提示框!"title = "提示"result = MessageBox(0, prompt, title, 1)End Sub```在上述代码中,我们首先声明了MessageBox函数,然后在Sub过程ShowMessageBox中调用了该函数。

如何在VBA中调用API函数

如何在VBA中调用API函数

如何在VBA中调用API函数在VBA中调用API函数是一项非常有用的技能,它可以帮助我们以更高效和灵活的方式操作和控制外部程序、系统资源和硬件设备。

本文将为您介绍如何在VBA中调用API函数,以实现更强大的功能。

首先,让我们了解API是什么。

API,全称为应用程序编程接口,是一组定义了应用程序之间通信规则的函数和协议。

通过调用API函数,我们可以与操作系统、外部库和设备进行交互,访问它们提供的功能和资源。

在VBA中调用API函数需要经过以下几个步骤:1. 了解API函数的参数和返回值在使用API函数之前,我们首先需要了解其提供的功能,以及需要传递的参数和返回值的数据类型。

通常,API函数的参数和返回值都有对应的数据类型,我们需要根据实际情况进行适配。

2. 声明API函数在VBA中,我们需要使用Declare语句来声明API函数。

Declare语句告诉VBA编译器该函数的名称、参数和返回值的数据类型以及它存在的库。

例如,下面是一个调用Windows API函数MessageBox的声明示例:```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```在上面的声明中,我们指定了MessageBox函数所在的库为"user32",并且声明了该函数的参数和返回值的数据类型。

3. 调用API函数在声明了API函数后,我们就可以在VBA代码中直接调用该函数了。

调用API函数需要提供正确的参数,并且根据API函数的返回值进行相应的处理。

例如,下面是调用MessageBox函数的示例:```Dim result As Longresult = MessageBox(0, "Hello, World!", "Message", 0)```上面的代码中,我们传递了四个参数给MessageBox函数,分别是0(窗口句柄,0表示当前活动窗口)、"Hello, World!"(消息文本)、"Message"(标题)、0(按钮和图标类型)。

VB动态改变及恢复屏幕设置下

VB动态改变及恢复屏幕设置下

VB动态改变及恢复屏幕设置下
三、在工程窗体中,加入两个按钮Command1和Command2,其Caption属性分别为“800x600x16”和“恢复原设置”。

其程序代码为:
窗口的“通用|声明”区
Option Explicit
Dim H, V, Color As Long
声名变量,用于保存最初屏幕设置
Private Sub Form_Load()
---------------以下代码用于得到最初的屏幕设备--------------
H = GetDeviceCaps(Form1.hdc, HORZRES)
V = GetDeviceCaps(Form1.hdc, VHORZRES)
Color = GetDeviceCaps(Form1.hdc, BITSPIXEL)
End Sub
Private Sub Command1_Click()
调用SetDispMode函数改变屏幕设置
SetDispMode 800, 600, 16
End Sub
Private Sub Command2_Click()
恢复最初屏幕设置
SetDispMode Cint(H), Cint(V), Cint(Color)
End Sub
四、将程序编译执行。

本程序执行后,如果单击Command1,则您的计算机屏幕显示模式将被设置为
“800x600x16”的显示模式;如果单击Command2, 则您的计算机屏幕显示模式将被设置为原来的显示模式。

此程序稍加修改,即可放置于桌面或任务栏中,直接快捷的修改屏幕设置。

在VB中使用API函数(之五)VB-电脑资料

在VB中使用API函数(之五)VB-电脑资料

在VB中使用API函数(之五)VB-电脑资料在 VB 中使用API函数 (之五) 子类处理当你一最大限度利用了VB 所给你的并且还想知道更多的东西,或只是想更多地了解你自己的窗口,你将会发现子类处理的优势. 子类处理是指用一个新的窗口函数来取代当前活动窗口函数.这个用户自定义函数能处理任何需要的消息,在VB中使用API函数 (之五)子类处理当你一最大限度利用了VB所给你的并且还想知道更多的东西,或只是想更多地了解你自己的窗口,你将会发现子类处理的优势.子类处理是指用一个新的窗口函数来取代当前活动窗口函数.这个用户自定义函数能处理任何需要的消息,并能调用原来的窗口函数,它将在原来的窗口函数之前收到各种消息.但原来的那个窗口处理函数依然存在,并没有消失.如果你不想处理某条消息,你应该让原来的窗口函数去处理它.子类处理是通过调用SetWindowLong函数实现的,该函数将改变指定窗口的特殊属性.下面是它的声明:Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA"(ByVal hwnd As Long, ByVal nIndex As Long,ByVal dwNewLong As Long) As Long第一个参数代表要进行子类处理的窗口,第二个参数应该是GWL_WNDPROC(-4),第三个参数是新的窗口函数的地址.参见回调和窗口函数一节.此函数将在窗口取得焦点,发生事件,或其他情况下(如其他进程改变了系统的某些参数)被随时调用.如果发生错误SetWindowLong函数将返回0,否则将返回原来的窗口函数的地址.这个地址特别重要,你应该把它保存在一个变量中或其他地方.当你不处理某些消息时(实际上,你可能只处理不到1%的消息,其他的都将由原窗口函数处理),调用原来的窗口函数就需要该地址.调用原窗口函数将由CallWindowProc来完成.这里是它的声明: Declare Function CallWindowProc Lib "user32" Alias"CallWindowProcA"(ByVal lpPrevWndFunc As Long,ByVal hWnd As Long,ByVal Msg As Long,ByVal wParam As Long, ByVal lParam As Long) As Long第一个参数是原窗口函数的地址,其他的同你接收到的四个参数一样.你可以改变其中的值来控制对消息的处理.例如,当你收到了一条WM_MOUSEMOVE消息时,你从lParam中得到鼠标所在位置的坐标并将其改成了其他的坐标.那么原窗口函数就会认为鼠标位于其他的位置从而做出一些有趣的事如显示其他控件的Tooltip.你指定的返回值也是有意义的,它依赖于发送的消息.在结束你的程序时将控制权交回给原窗口函数是很重要的,通常在Form_Unload中完成如下:Ret& = SetWindowLong(Me.Hwnd, GWL_WNDPROC, oldWndProcAddress)如果你在VB中启动程序时忘掉了这一行,结果将是VB崩溃并会丢失尚未保存的数据.千万要小心.这里是子类处理的一个简单示例:Dim oldWndProc As LongPrivate Sub Form_Load()ldWndProc = SetWindowLong(Me.Hwnd, GWL_WNDPROC, AddressOf MyWndProc)End SubPrivate Sub Form_Unload()Ret& = SetWindowLong(Me.Hwnd, GWL_WNDPROC, oldWndProc)End SubFunction MyWndProc(ByVal Hwnd As Long,ByVal wMsg as Long,ByVal wParam As Long,ByVal lParam As Long)De bug.Print wMsg & " " & wParam & " " & lParamRet& = CallWindowProc(oldWndProc, Hwnd, wMsg, wParam, lParam)End Function处理参数有时函数并不以你所需的方式返回信息.一个典型的例子是将两个代表鼠标位置的整形(2 byte)数合并为一个4 Byte的数.还有一个例子是判断一个数的某位是否为1.你还可能得到一个代表一个结构地址的Long型数.合并和分离一个数并不需要过多的描述.你能在我们的网站(/SiliconValley/Lab/1632/)上找到APIMacro.bas,它包含了你需要的多种函数.可以用一下方法检查一个数的第N位是否为1:If Value and (2^N) then ...置1Value = Value Or 2^N置0Value = Value And Not 2^N如果你想设定或取得预先知道的某位的信息,用1024代替2^10要快的多.因为这样VB无需自己进行计算(VB憎恨 "^" ?).如果你接收到一个类型的指针,你要做的工作将稍多一点.你可以使用CopyMem函数来取得信息.下面是它的声明:Declare Sub CopyMem Lib "kernel32" Alias "RtlMoveMemory" (pDest As Any, pSource As Any, ByVal ByteLen As Long)如果你接收到了一个指向RECT 类型的指针并存在Long型变量Addr 中,可以这样处理:Dim Info As RectCall CopyMem(Info, ByVal Addr, len(Info))注意ByVal关键字.现在,如果你想把信息写回,使用:Call CopyMem(ByVal Addr, Info, Len(Info))。

在VB中使用API函数

在VB中使用API函数

☆★☆★技术文档★☆★☆☆★☆★技术文档★☆★☆☆★☆★技术文档★☆★☆☆★☆★技术文档★☆★☆VB 与 Windows API 讲座(一) /王国荣进入 Windows API 的热身运动「VB 没有提供这样的功能,必须呼叫 Windows API」,有时候笔者会这样回答读者的问题,虽然这麽回答有点偷懒,或者说不负责任,但这的确是事实,VB 所提供的叙述、函数、物件…虽然也不在少数,但是都十分标准,或者说规矩,想变点花样,通常是行不通的,这是笔者决定开始撰写本文的主要原因。

Windows API 是大家的感觉上 VB 程式要呼叫 Windows API 是一件比较困难的事情,或者说比较麻烦的事情,但别忘了 Windows API 是大家的,凡是在 Windows 工作环境底下执行的应用程式,都有权利呼叫 Windows API。

Windows 这个多工作业系统除了协调应用程式的执行、分配记忆体、管理系统资源…之外,她同时也是一个很大的服务中心,呼叫这个服务中心的各种服务(每一种服务就是一个函数),可以帮应用程式达到开启视窗、描绘图形、使用周边设备…等目的,由於这些函数服务的对象是应用程式(Application),所以便称之为 Application Programming Interface,简称 API 函数。

但 Windows API 与 C 语言最亲近虽然说呼叫 Windows API(以下简称 API 或 API 函数) 是每一个应用程式的权利,但不可否认的 API 却与 C 语言最亲近,因为 API 函数在参数的传递上就是以 C 语言为标准。

但这并不表示 VB 程式不能呼叫含有参数的 API 函数,如果传递的参数是单纯的资料型别,例如「整数」,则 VB 与 C 语言还是相通的,如果是特殊的资料型别(包含「字串」),则必须遵循一定的规范,否则不是无法得到正确的结果,就是因为违反规定而被踢出系统。

vb api函数使用手册

vb api函数使用手册

vb api函数使用手册VB(Visual Basic)是一种易于学习和使用的编程语言,广泛应用于Windows操作系统的开发中。

在VB中,API(应用程序编程接口)函数提供了访问操作系统底层功能的途径。

本手册旨在帮助开发者熟悉和正确使用VB中的API函数。

一、什么是API函数API(Application Programming Interface)函数是一组操作系统或应用程序提供的功能接口。

通过调用API函数,开发者可以访问操作系统底层功能,实现更为高级和复杂的功能需求。

VB中的API函数主要用于实现与操作系统进行交互,如读取系统信息、控制系统行为等。

二、API函数的声明和使用VB中使用API函数需要进行以下四个步骤:声明、加载、调用和释放。

1.声明在VB代码中声明API函数,需要使用Declare语句。

具体的语法如下:Declare Function 函数名 Lib "库名" Alias "函数别名" (参数列表) As 返回值类型其中,- 函数名表示API函数的名称;- 库名表示包含API函数的动态链接库(DLL)文件名;- 函数别名是可选的,用于给API函数指定一个不同于其在DLL中定义的名称;- 参数列表表示API函数的参数,多个参数之间使用逗号分隔;- 返回值类型表示API函数的返回值类型。

2.加载在VB代码中加载API函数所在的DLL,需要使用LoadLibrary函数。

具体的语法如下:Declare Function LoadLibrary Lib "kernel32" Alias "LoadLibraryA" (ByVal lpLibFileName As String) As Long其中,- LoadLibrary是一个Windows API函数,用于加载指定的DLL文件;- "kernel32"表示包含LoadLibrary函数的动态链接库文件;- "LoadLibraryA"是LoadLibrary函数的别名,其中A表示使用ANSI字符集。

在VB中使用API函数

在VB中使用API函数

在VB中使用API函数在VB中,使用API函数可以为程序添加更多的功能和灵活性。

API 函数是由Windows操作系统提供的动态链接库(DLL)中的函数,可以通过声明函数的方式在VB中调用它们。

1. GetTickCount函数:GetTickCount函数用于获取自系统启动以来的毫秒数。

可以使用它来计算程序的运行时间或者进行定时操作。

声明函数:Declare Function GetTickCount Lib "kernel32" ( As Long使用示例:Dim startTime As LongstartTime = GetTickCount'运行程序的一些操作Dim endTime As LongendTime = GetTickCountDim duration As Longduration = endTime - startTimeMsgBox "程序运行时间:" & duration & "毫秒"2. GetAsyncKeyState函数:GetAsyncKeyState函数用于检测指定键是否被按下。

可以用于开发游戏、快捷键等功能。

声明函数:Declare Function GetAsyncKeyState Lib "user32" (ByVal vKey As Long) As Integer使用示例:If GetAsyncKeyState(vbKeyF1) ThenMsgBox "F1被按下"End If3. GetCursorPos函数:GetCursorPos函数用于获取鼠标的屏幕坐标。

可以用于开发屏幕取点等功能。

声明函数:Declare Function GetCursorPos Lib "user32" (ByRef lpPoint As POINTAPI) As Long使用示例:Dim cursorPos As POINTAPIGetCursorPos cursorPosMsgBox "鼠标当前位置:" & cursorPos.X & ", " & cursorPos.Y4. FindWindow函数:FindWindow函数用于查找指定窗口的句柄。

VB6中API函数的使用

VB6中API函数的使用

VB6中API函数的使用在VB6中,可以通过API函数来调用Windows操作系统提供的一些功能或特性。

这些API函数通常是由用户编写的DLL(动态链接库)文件中提供的。

下面将介绍API函数的使用方法,并提供一些常用的API函数示例。

1.声明API函数:在VB6中,可以使用Declare关键字来声明API函数的原型。

声明的语法为:```Declare Function 函数名 Lib "库名称" ([参数列表]) As 返回值类型```其中,函数名指定API函数的名称,Lib指定DLL文件的名称,参数列表和返回值类型是API函数的参数和返回值的说明。

2.API函数的使用:要使用API函数,首先需要加载相应的DLL文件。

可以使用LoadLibrary函数来加载DLL文件,并返回一个模块的句柄。

然后使用GetProcAddress函数来获取API函数的指针,然后可以使用函数指针来调用API函数。

最后,使用FreeLibrary函数释放加载的DLL文件。

下面是示例代码:```vb'声明API函数的原型Declare Function MessageBox Lib "user32" Alias "MessageBoxA" (ByVal hWnd As Long, ByVal lpText As String, _ByVal lpCaption As String, ByVal uType As Long) As LongSub ShowMessageBoxDim hUser32 As LongDim pMessageBox As Long'加载user32.dllhUser32 = LoadLibrary("user32.dll")' 获取MessageBoxA函数的指针pMessageBox = GetProcAddress(hUser32, "MessageBoxA")' 使用函数指针调用MessageBoxA函数Call DWORD(pMessageBox)(0, "Hello World!", "Message", vbInformation)'释放user32.dllFreeLibrary hUser32End Sub```上述代码示例使用了user32.dll中的MessageBoxA函数来显示一个消息框。

vb使用API改变菜单

vb使用API改变菜单
' The error occurred at 337 items between all three menu arrays. This does
' not take into account the other higher level menus in the application.
GetMenuItemID(nextsubmenuhWnd, i), "Menu Item " & CStr(i + 1))
End If
Next
nextsubmenuhWnd = GetSubMenu(submenuhWnd, 1) ' get the second sub menu of the sub menu
On Error GoTo TooManyMenus
Load mnuList1(i)
On Error GoTo 0
mnuList1(i).Caption = "Menu Item " & CStr(i + 1)
' if we've reached the breakpoint then add a new column with
Load mnuList3(i)
On Error GoTo 0
mnuList3(i).Caption = "Menu Item " & CStr(i + 1)
' if we've reached the breakpoint then add a new column without a vertical bar
breakpoint = (GetSystemMetrics(SM_CYFULLSCREEN) - menuheight) \ menuheight

VB调用API函数动态改变及恢复屏幕设置

VB调用API函数动态改变及恢复屏幕设置

VB调用API函数动态改变及恢复屏幕设置
江楠
【期刊名称】《山东煤炭科技》
【年(卷),期】2002(000)004
【摘要】该文介绍了Windows API函数及在VB中声明、调用及参数传递的方法,详细描述了VB调用API函数动态改变及恢复屏幕设置的实现方法。

【总页数】2页(P32-33)
【作者】江楠
【作者单位】山东科技大学(济南校区)计算中心
【正文语种】中文
【中图分类】TP3
【相关文献】
1.利用API函数改变和恢复屏幕的分辨率 [J], 倾明
2.在VB中调用API函数 [J], 祝凤莲
3.Vb中调用API函数进行区域填充 [J], 王凡
4.用VB调用Windows API函数实现机房实时监控 [J], 苏旺辉
5.基于VB调用Windows API函数编程技巧的研究 [J], 马也
因版权原因,仅展示原文概要,查看原文内容请购买。

在VB中使用API函数

在VB中使用API函数

在VB中使用API函数在VB中,可以使用API函数来实现一些高级功能或者与操作系统进行交互。

API(Application Programming Interface)是操作系统提供给开发人员的一组函数和接口,可以通过调用这些函数和接口来访问操作系统的底层功能。

1. 调用Windows API函数获取系统时间使用`GetSystemTime`函数可以获取当前系统的时间信息。

```vbPrivate Type SYSTEMTIMEwYear As IntegerwMonth As IntegerwDayOfWeek As IntegerwDay As IntegerwHour As IntegerwMinute As IntegerwSecond As IntegerwMilliseconds As IntegerEnd TypePrivate Declare Sub GetSystemTime Lib "kernel32" (lpSystemTime As SYSTEMTIME)Private Sub GetTimeDim sysTime As SYSTEMTIMEGetSystemTime sysTimeMsgBox "Current Time: " & sysTime.wHour & ":" &sysTime.wMinute & ":" & sysTime.wSecondEnd Sub```2. 调用Windows API函数显示消息框使用`MessageBox`函数可以显示一个消息框。

```vbPrivate Declare Function MessageBox Lib "user32" Alias "MessageBoxA" (ByVal hWnd As Long, ByVal lpText As String, ByVal lpCaption As String, ByVal wType As Long) As LongPrivate Sub ShowMessageDim result As Longresult = MessageBox(0, "Hello World!", "Message", vbInformation)If result = 1 ThenMsgBox "User clicked OK"ElseMsgBox "User clicked Cancel"End IfEnd Sub```3. 调用Windows API函数实现全屏显示使用`ShowWindow`函数可以设置应用程序窗口的显示状态。

API函数在VB程序中的应用

API函数在VB程序中的应用

API函数应用作为一个编程初学者来说,API函数也许是一个时常耳闻却感觉有些神秘的东西。

单看它的复杂语法,就足令人望而生畏,但是任何事物在我们深入了解它之前,总是会有这种感觉的。

我们这篇API入门教程的目的,就是要把API函数的来龙去脉告诉大家,破除对API函数的畏惧,使它成为我们编程的好助手。

大家可能在许多书上看到过API的英文全称(ApplicationProgrammingInterface),WIN32API也就是MicrosoftWindows32位平台的应用程序编程接口。

对这个定义的理解,需要追溯到操作系统的发展历史上,当WINDOWS操作系统开始占据主导地位的时候,开发WINDOWS平台下的应用程序成为人们的需要。

而在WINDOWS程序设计领域处于发展的初期,WINDOWS程序员所能使用的编程工具唯有API函数,这些函数是WINDOWS提供给应用程序与操作系统的接口,他们犹如“积木块”一样,可以搭建出各种界面丰富,功能灵活的应用程序。

所以可以认为API函数是构筑整个WINDOWS框架的基石,在它的下面是WINDOWS 的操作系统核心,而它的上面则是所有的华丽的WINDOWS应用程序。

但是,那时的WINDOWS程序开发还是比较复杂的工作,程序员必须熟记一大堆常用的API函数,而且还得对WINDOWS操作系统有深入的了解。

然而随着软件技术的不断发展,在WINDOWS平台上出现了很多优秀的可视化编程环境,程序员可以采用“即见即所得”的编程方式来开发具有精美用户界面和功能强大的应用程序。

这些优秀可视化编程环境操作简单、界面友好(诸如VB、VC++、DELPHI等),在这些工具中提供了大量的类库和各种控件,它们替代了API的神秘功能,事实上这些类库和控件都是构架在WIN32API函数基础之上的,是封装了的API函数的集合。

它们把常用的API函数的组合在一起成为一个控件或类库,并赋予其方便的使用方法,所以极大的加速了WINDOWS应用程序开发的过程。

在VB中使用API函数详解

在VB中使用API函数详解

在VB中使用API函数详解API(Advanced Programmers Interface,高级程序员接口)(注:API 实际是指Application Programming Interface,应用程序编程接口;此处疑为原文错误,不过在VB中也可以这么说吧!)是一套用来控制Windows的各个部件(从桌面的外观到位一个新进程分配的内存)的外观和行为的一套预先定义的Windows函数.用户的每个动作都会引发一个或几个函数的运行以Windows告诉发生了什么.一、什么是API? API(Application Programming Interface,应用程序编程接口)是一套用来控制Windows的各个部件(从桌面的外观到位一个新进程分配的内存)的外观和行为的一套预先定义的Windows函数.在某种程度上很象Windows的天然代码.其他的语言只是提供一种能自动而且更容易的访问API的方法.二、Windows的一些特别之处Windows通过句柄(Handle)识别每个窗体,控件,菜单,菜单项或其他任何你能想得到的东西.当你的程序运行时,它所包含的每个部件都有一个唯一确定的句柄用来同其他的部件相区别.例如,某个按钮得句柄就与其他部件不同,当你想要通过API来执行有关该按钮的某种操作时就必须使用这个句柄.从哪儿得到它呢?VB 为每个拥有Windows句柄的控件都提供了Hwnd属性来表示其句柄.三、Any 四、回调(CallBacks) 五、子类处理Windows的一些特别之处这个主题是要告诉你Windows 的一些与在VB中的不同的细节Windows通过句柄(Handle)识别每个窗体,控件,菜单,菜单项或其他任何你能想得到的东西.当你的程序运行时,它所包含的每个部件都有一个唯一确定的句柄用来同其他的部件相区别.例如,某个按钮得句柄就与其他部件不同,当你想要通过API来执行有关该按钮的某种操作时就必须使用这个句柄.从哪儿得到它呢?VB 为每个拥有Windows句柄的控件都提供了Hwnd属性来表示其句柄.Windows 使用像素(Pixel)而不是缇(Twip).因此,把涉及API函数调用的控件的ScaleMode属性设为3--(Pixel)是个不错的主意,这样你可以通过ScaleXXX属性得到它们的公制单位值.尽管这样,你可能有时仍需要进行从Twip到Pixel的转换(反之亦然),你可以通过Screen对象的TwipsPerPixelX和TwipsPerPixelY来实现.举例如下:PixelXValue=TwipXValue\Screen.TwipsPerPixelX PixelYValue=TwipYValue\Screen.TwipsPerPixelY TwipXValue=PixelXValue*Screen.TwipsPerPixelX TwipYValue=PixelYValue*Screen.TwipsPerPixelY我并没有在实际中见到过TwipsPerPixelX 和TwipsPerPixelY 的值有什么不同,但你最好是把它们区别开来而不是混用,这至少是一种好的程序设计风格.另外需要注意的是,这里用的是" \ "(整除) 而不是 " / " ,这是因为像素值必须是整数. 另外需要提到的是,Windows函数中用到了不同的坐标系统,因此需要注意.Windows的一些特别之处最后要注意的是,一旦你使用了API 函数,VB就可能不再可靠了---API调用中一个简单的语法错误就会导致VB 崩溃!(请经常保存您的工程).VB 并不能识别API调用中的错误,因此一旦你的程序出现异常,要先检查API调用---是否缺少 ByVal,或者是错误的类型,参数等等. 从哪里得到有关函数的说明? 这个主题不会告诉你如何通过API函数改变按钮文字或如何快速查找一个文件.这不是一个API函数文档. 为了得到有关函数的说明,你需要SDK帮助或微软的SDK文档(至少有40M---我怎么可能放在这里?).这些SDK帮助通常都包含在Borland Dephli 3.0 开发包或者MS Visual C++中.到网上去或找您的朋友要一个,版本越新越好注意Win3.x 的SDK 帮助对你并没有用,因为很多函数已经过于陈旧甚至废弃不用,尽管他们中的大多数由于与 Windows95兼容而依然存在.API参数类型如果你已经有了一个SDK帮助,你肯定主意到了函数的返回之或参数有很多奇怪的类型如VOID,LPCSTR, 和DWORD.如果你对C语言比较熟悉的话,那你肯定明白它们的意思.对于其他不熟悉C语言的人,这里有一张摘自VB Books Online(标题是:C语言声明到Visual Basic的转换) Books Online(标题是:C语言声明到Visual Basic的转换) <> bordercolordark="#FFFFFF" cellpadding="0">API参数类型注释:你应该注意到了BOOL类型(Boolean)求出的值为Long而不是Boolean.因此0表示"假"(False),其他任何值表示"真"(True). HWND,HDC,HMENU,etc.---etc.指其他所有与于前面所述相似的类型.它们都以"H"开头来表示不同对象的句柄.举例来说,HBITMAP表示一副位图的句柄,HBRUSH标是一个刷子的句柄等等.它们均为Long而且要按值传递(ByVal).同样要注意LPVOID被声明为Any型变量,本文将会有独立的一个主题用来论述Any类型.有些类型以"LP"开头.LP 是Long Pointer的缩写.因此LPWORD 实际表示数据所存的内存地址.不过,你并没有必要调用某个函数来获取这个地址.当你按引用(ByRef)传递参数时,你实际上传递的就是它的地址.在这里你只需记住:如果某个参数的类型以"LP"开头,应该按引用(ByRef)传递.顺便说一句,LPARAM 与Lparam 很相似但不是Lparam,Lparam不是一个指针,在这里你必须传递它的真实值,因此要按值(ByVal)传递.NULL也是一种奇怪的类型.你可以从VB 中了解到有关它的描述,这里我不去讨论它.按你需要的形式传递它吧,在大多数情况下,可以用ByVal 0& 或 vbNullString.最后,VOID是用来指那些没有返回值的函数的.API中没有SUBs,这就是它们的标志.只要记住:如果一个函数被声明为VOID ,你必须在VB 中把它声明为 SUBAny有些消息的参数声明为Any.这表示该参数是一种可变的类型(你可以以整型,字符串,用户自定义或其他的类型来传递). 这有一个这样的例子:Public Declare Function SendMessage Lib "User32" Alias "SendMessageA"(ByVal Hwnd as Long, ByVal wMsg as Long, ByVal wParam as Long, lParam as Any) as Long lParam 声明为Any 并按引用(ByRef)传递.这里是在这个函数中如果lParam是不同类型的值时应遵循的规则: 如果该值是传递形式numeric ByVal(as Long,or as Any) Null ByVal(as Long,or as Any) String ByRef(as String,or as Any) Type ByRef(as Any) array of Type ByRef(as Any)如果你的函数声明同上面的一个而且你想传递一个Long型数,你应该这样写:Call SendMessage(Me.Hwnd,WM_XXXX,0&,ByVal LongValue) 注意尽管头三个参数也是数值,但它们前边并没有ByVal.这是因为在函数声明中它们已经被声明为按值传递(ByVal).第四个参数,由于是按引用传递(ByRef)(VB并不知道你要传递参数的类型),因此你必须加上ByVal 你可以使用别名技术来传递不同类型的参数:Public Declare Function SendMessageLng Lib "User32" Alias "SendMessageA"(ByVal Hwnd as Long, ByVal wMsg as Long, ByVal wParam as Long, ByVal lParam as Long) as Long或:Public Declare Function SendMessageStr Lib "User32" Alias "SendMessageA"(ByVal Hwnd as Long, ByVal wMsg as Long, ByVal wParam as Long, lParam as String) as Long注意API参数类型本身是不会改变的.例子中的第四个参数总是一个4字节的长型数.当你按值(ByVal)传递一个Long或Null时,该4字节长的数值就直接传递给函数.如果你传递一个String或其他的什么,你是按引用(ByRef)传递,VB传递的实际上是变量的地址,也是4个字节.参数传递你已经知道如何传递参数了,只需把他放到调用的函数中即刻.然而,当你使用API函数时,在传递参数是有一些你应该注意的细节. ByVal还是ByRef. 通常情况下,你不用为此担心,VB的API浏览器已经为你做好了一切,只需你输入数值它就会照所声明的方式传递.总的来说,ByVal是把实际的数值传递给函数,而ByRef是把地址传给函数.唯一的麻烦就是Any 类型. 把字符串传递给API函数也并不难.API函数需要的是字符串首字符的地址,然后读取该地址直到遇到一个Null字符.听起来很糟糕,但只是VB处理字符串的实际方法.你唯一要记住的是一定要按引用传递(ByRef)字符串当你想得到所需的函数返回值信息时,情况有稍微的一点不同. 这里是GetComputerName函数的声明: Declare Function GetComputerName Lib "kernel32" Alias "GetComputerNameA"(ByVal lpBuffer As String, nSize As Long) As Long第一个参数是一个指向字符串的远程指针,第二个参数是字符串的长度.如果你只是简单的声明一个字符串类型的变量并把它传递给函数,就会出现错误.因此,你首先需要初始化字符串.这里是如何得到计算机名字的例子:Dim Buffer As String Buffer = Space(255) Ret& = GetComputerName(Buffer, Len(Buffer)) if Ret& > 0 thenCompName$ = Left(Buffer, Ret&)在这里,待传递的字符串被初始化为有255个空格的字符串.我们把它传递给函数同时还有它的长度.如果出错则返回值为0.参数传递CompName中将保存计算机名. 有些函数也需要传递数组,这里是一个例子:Declare Function SetSysColors Lib "user32" Alias "SetSysColors" (ByVal nChanges As Long, lpSysColor As Long, lpColorValues As Long) As Long最后两个参数是Long型数组.为了传递数组,你只需传递它的第一个元素.下面是示例代码:Const COLOR_ACTIVECAPTION = 2 Const COLOR_INACTIVECAPTION = 3Const COLOR_CAPTIONTEXT = 9Const COLOR_INACTIVECAPTIONTEXT = 19Dim SysColor(3) As Long Dim ColorValues(3) As LongDim Ret& SysColor(0) = COLOR_ACTIVECAPTIONSysColor(1) = COLOR_INACTIVECAPTIONSysColor(2) = COLOR_CAPTIONTEXTSysColor(3) = COLOR_INACTIVECAPTIONTEXT ColorValues(0) = RGB(58, 158, 58) ’深绿ColorValues(1) = RGB(93, 193, 93) ’浅绿ColorValues(2) = 0 ’黑色ColorValues(3) = RGB(126, 126, 126) ’灰色 Ret& = SetSysColors(4&, SysColor(0), ColorValues(0)) 该程序将改变所有活动和非活动窗口的标题栏背景和文本的颜色.回调(CallBacks)所谓回调,就是你自己定义一个函数,并告诉Windows何时为何调用.你可以写一个有特定数量和类型参数的函数,然后告诉Windows何时调用,并传递给它所需的参数.Windows就会调用你定义的函数,处理参数,并给你返回值.回调的一个典型应用是从Windows获得连续的数据流.这里是一个需要回调的函数的声明:Declare Function EnumWindows Lib "User32"ByVal lpEnumFunc As Long, ByVal lParam As Long) As Long 第一个参数是你的回调函数的地址,第二个参数是你想传递的的任意数值.该值将被传递到你的函数,于是你就知道了它要调用什么.VB 5.0已经提供了一个很有用的操作符AddressOf ,可以得到一个函数的地址.当你调用一个函数时它只能用在参数的前面,下面这种用法是错误的并且会导致出错: FuncP = AddressOf MyFunction 因此你必须这样调用EnumWindows函数: Success& = EnumWindows(AddressOf cbFunc, 58&) 你必须也要自己写回调函数.问题是有很多不同类别的回调并且有各种各样的参数,有关这些参数的描述可以在SDK帮助或MS SDK文档中找到.这里是一个回调的声明:Function cbFunc (ByVal Hwnd, ByVal lParam) as Long这里是一个回调的例子:Private Declare Function GetWindowText Lib "user32" Alias "GetWindowTextA"(ByVal hwnd As Long,ByVal lpString As String,ByVal cch As Long) As Long Success& = EnumWindows(AddressOf cbFunc, 58&)Function cbFunc (ByVal Hwnd, ByVal lParam) as LongIf lParam = 58 then ’enum windows Str$ = Space(255) Ret& = GetWindowText(Str$, Len(Str$))Debug.Print Left(Str$, Ret&)End IfEnd Function这个例子将列出窗口的标题,(不包含子窗体)窗口程序Windows并不知道事件. 这些是VB特有的隐藏Windows获取你的窗口发生事件的真正方法的一种方式.VB很像是一个将Windows语言翻译成VB语言的解释器.但是事实并非如此,你很快就会遇到.设想你想知道用户何时加亮了菜单选项(不是点击,只是加亮即选择了)VB并不提供这种事件,但你可能见到其他的程序,但你浏览它的菜单时状态栏会出现相应的文字.如果他们能,你为何不能?OK,这里是大致的真实情况.每个窗口都有一个特殊的程序叫做窗口程序.它实际上是一个回调函数.该函数将在你的窗口发生事件的任何时间发送消息.这样当用户加亮一个菜单项时就会发送一条消息(WM_COMMAND).那为什么我看不到这条消息呢?这是因为是VB创建窗口程序而不是你.当Windows发送消息时,该程序将为之分派特定的事件,并将其参数转换为比较容易用的事件的参数.但是在有些情况下,它会忽略有些消息而不能收到真实的输入.如果你真的想得到这些消息,你必须对你的窗体进行子类处理,我们将在另外一个主题中谈到.这里是一个回调窗口程序的声明:Function WindowProc(ByVal Hwnd As Long, ByVal wMsg As Long,ByVal wParam As Long, ByVal lParam As Long) As Long 第一个参数指定窗口的句柄,第二个参数是消息的标识符(如WM_COMMAND或WM_MOUSEMOVE),wParam和lParam时两个32位的数值,它们的意义依赖于消息的类型.子类处理当你一最大限度利用了VB所给你的并且还想知道更多的东西,或只是想更多地了解你自己的窗口,你将会发现子类处理的优势.子类处理是指用一个新的窗口函数来取代当前活动窗口函数.这个用户自定义函数能处理任何需要的消息,并能调用原来的窗口函数,它将在原来的窗口函数之前收到各种消息.但原来的那个窗口处理函数依然存在,并没有消失.如果你不想处理某条消息,你应该让原来的窗口函数去处理它.子类处理是通过调用SetWindowLong函数实现的,该函数将改变指定窗口的特殊属性.下面是它的声明:Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA"(ByVal hwnd As Long, ByVal nIndex As Long,ByVal dwNewLong As Long) As Long第一个参数代表要进行子类处理的窗口,第二个参数应该是GWL_WNDPROC(-4),第三个参数是新的窗口函数的地址.参见回调和窗口函数一节. 此函数将在窗口取得焦点,发生事件,或其他情况下(如其他进程改变了系统的某些参数)被随时调用. 如果发生错误SetWindowLong函数将返回0,否则将返回原来的窗口函数的地址.这个地址特别重要,你应该把它保存在一个变量中或其他地方.当你不处理某些消息时(实际上,你可能只处理不到1%的消息,其他的都将由原窗口函数处理),调用原来的窗口函数就需要该地址.子类处理当你一最大限度利用了VB所给你的并且还想知道更多的东西,或只是想更多地了解你自己的窗口,你将会发现子类处理的优势.子类处理是指用一个新的窗口函数来取代当前活动窗口函数.这个用户自定义函数能处理任何需要的消息,并能调用原来的窗口函数,它将在原来的窗口函数之前收到各种消息.但原来的那个窗口处理函数依然存在,并没有消失.如果你不想处理某条消息,你应该让原来的窗口函数去处理它.子类处理是通过调用SetWindowLong函数实现的,该函数将改变指定窗口的特殊属性.下面是它的声明:Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA"(ByVal hwnd As Long, ByVal nIndex AsLong,ByVal dwNewLong As Long) As Long第一个参数代表要进行子类处理的窗口,第二个参数应该是GWL_WNDPROC(-4),第三个参数是新的窗口函数的地址.参见回调和窗口函数一节. 此函数将在窗口取得焦点,发生事件,或其他情况下(如其他进程改变了系统的某些参数)被随时调用. 如果发生错误SetWindowLong函数将返回0,否则将返回原来的窗口函数的地址.这个地址特别重要,你应该把它保存在一个变量中或其他地方.当你不处理某些消息时(实际上,你可能只处理不到1%的消息,其他的都将由原窗口函数处理),调用原来的窗口函数就需要该地址.子类处理调用原窗口函数将由CallWindowProc来完成.这里是它的声明: Declare Function CallWindowProc Lib "user32" Alias"CallWindowProcA"(ByVal lpPrevWndFunc As Long,ByVal hWnd As Long,ByVal Msg As Long,ByVal wParam As Long, ByVal lParam As Long) As Long第一个参数是原窗口函数的地址,其他的同你接收到的四个参数一样.你可以改变其中的值来控制对消息的处理.例如,当你收到了一条WM_MOUSEMOVE消息时,你从lParam中得到鼠标所在位置的坐标并将其改成了其他的坐标.那么原窗口函数就会认为鼠标位于其他的位置从而做出一些有趣的事如显示其他控件的Tooltip.你指定的返回值也是有意义的,它依赖于发送的消息. 在结束你的程序时将控制权交回给原窗口函数是很重要的,通常在Form_Unload中完成如下: Ret& = SetWindowLong(Me.Hwnd, GWL_WNDPROC, oldWndProcAddress) 如果你在VB中启动程序时忘掉了这一行,结果将是VB崩溃并会丢失尚未保存的数据.千万要小心.这里是子类处理的一个简单示例:Dim oldWndProc As LongPrivate Sub Form_Load()oldWndProc = SetWindowLong(Me.Hwnd, GWL_WNDPROC, AddressOf MyWndProc)End SubPrivate Sub Form_Unload()Ret& = SetWindowLong(Me.Hwnd, GWL_WNDPROC, oldWndProc)End SubFunction MyWndProc(ByVal Hwnd As Long,ByVal wMsg as Long,ByVal wParam As Long,ByVal lParam As Long)Debug.Print wMsg & " " & wParam & " " & lParam Ret& = CallWindowProc(oldWndProc, Hwnd, wMsg, wParam, lParam) End Function处理参数有时函数并不以你所需的方式返回信息.一个典型的例子是将两个代表鼠标位置的整形(2 byte)数合并为一个4 Byte的数.还有一个例子是判断一个数的某位是否为1.你还可能得到一个代表一个结构地址的Long型数.合并和分离一个数并不需要过多的描述.你能在我们的网站(/SiliconValley/Lab/1632/)上找到APIMacro.bas,它包含了你需要的多种函数. 可以用一下方法检查一个数的第N位是否为1: If Value and (2^N) then ... 置1 Value = Value Or 2^N 置0 Value = Value And Not 2^N如果你想设定或取得预先知道的某位的信息,用1024代替2^10要快的多.因为这样VB无需自己进行计算(VB憎恨 "^" ?).如果你接收到一个类型的指针,你要做的工作将稍多一点.你可以使用CopyMem函数来取得信息.下面是它的声明: Declare Sub CopyMem Lib "kernel32" Alias "RtlMoveMemory" (pDest As Any, pSource As Any, ByVal ByteLen As Long) 如果你接收到了一个指向RECT 类型的指针并存在Long型变量Addr 中,可以这样处理: Dim Info As Rect Call CopyMem(Info, ByVal Addr, len(Info)) 注意ByVal 关键字.现在,如果你想把信息写回,使用: Call CopyMem(ByVal Addr, Info, Len(Info))结束语我希望这份教程能帮助你理解如何控制API函数的威力和如何正确使用它们.但是要小心!就像火,如果你让它失去控制,你就会玩蛋.当然,不要忘了VB是进行简单.安全程序设计的语言,而API函数则正好相反.如果你想得到更多的控制功能,最好转移到VC++ 或者Delphi. 祝你在API探险中好运!。

在VB中使用API函数 (之一)

在VB中使用API函数 (之一)
I"中所说,API函数包含在位于系统目录下的DLL文件中.你可以自己输入API函数的声明,但VB提供了一种更简单的方法,即使用API Text Viewer.
要想在你的工程中声明API函数,只需运行API Text Viewer,打开Win32api.txt(或.MDB如果你已经把它转换成了数据库的话,这样可以加快速度.注:微软的这个文件有很多的不足,你可以试一下本站提供下载的api32.txt),选择"声明",找到所需函数,点击"添加(Add)"并"复制(Copy)",然后粘贴(Paste)到你的工程里.使用预定义的常量和类型也是同样的方法.
这在某种程度上很象Windows的天然代码.其他的语言只是提供一种能自动而且更容易的访问API的方法.VB在这方面作了很多工作.它完全隐藏了API并且提供了在Windows环境下编程的一种完全不同的方法.
这也就是说,你用VB写出的每行代码都会被VB转换为API函数传递给Windows.例如,Form1.Print...VB 将会以一定的参数(你的代码中提供的,或是默认参数)调用TextOut 这个API函数.
小偷其实是Visual Basic.但它并没有偷走你的信,而是在阅读了之后挑出重要的以一种好的方式告诉你.这种方式就是你代码中的事件(Event).
这样,当用户在你的窗体上移动鼠标时,Windows会发送一条WM_MOUSEMOVE消息给你的窗口,VB得到这条消息以及它的参数并运行你在事件MouseMove中的代码,同时VB会把这条消息的第二个32位数(它包含了x,y坐标,单位为像素(Pixel),每个位16位)转换为两个单精度数,单位为缇(Twip).
同样,当你点击窗体上的一个按钮时,Windows会发送一个消息给窗体(这对于你来说是隐藏的),VB获取这个调用并经过分析后生成一个特定事件(Button_Click).
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Private Type DEVMODE
dmDeviceName As String * CCHDEVICENAME
dmSpecVersion As Integer
dmDriverVersion As Integer
dmSize As Integer
dmDriverExtra As Integer
Alias "lstrcpyA" (lpString1 As Any, lpString2 As Any) As Long
‘------------------以下结构用于屏幕的初始化-----------------
Const CCHDEVICENAME = 32
Const CCHFORMNAME = 32
---- 并在模块中添加如下代码:
‘---------------以下代码用于得到屏幕的设置参数--------------
Declare Function GetDeviceCaps Lib
"gdi32" (ByVal hdc As Long,
ByVal nIndex As Long) As Long
(ByVal lpDevMode As Long, ByVal dwflags As Long) As Long
‘------------------设置屏幕的函数-----------------
Public Function SetDispMode(Width As Integer,
Height As Integer, Color As Integer) As Long
Dim H, V, Color As Long
’声名变量,用于保存最初屏幕设置
Private Sub Form_Load()
‘---------------以下代码用于得到最初的屏幕设备--------------
H = GetDeviceCaps(Form1.hdc, HORZRES)
V = GetDeviceCaps(Form1.hdc, VHORZRES)
在VB中调用API函数动态改变及恢复屏幕设置
对于Windows平台,显示器的分辩率和颜色数很重要,尤其是对于多媒体应用软件和游戏软件。但许多情况下,用户当前的屏幕设置并不适合软件的运行需要。软件通常的做法是提示用户将屏幕设置到软件要求的分辩率及颜色数,再重新启动软件。这样无疑会增加普通用户操作上的负担和困难,降低了软件的友好性和易用性。
---- 理想的作法是:在软件开始时,动态ห้องสมุดไป่ตู้改变屏幕设置来达到软件运行的要求。在软件运行结束后,再自动把屏幕设置改回原来的设置值。这一切过程都在不知不觉中完成。这一做法可以通过在VB中调用API(应用程序接口)函数做到。实现方法如下:
---- 一、打开一个标准的EXE工程。
---- 二、在“工程”菜单栏下,选取“添加模块”,为工程添加一个模块。
‘取指定设备信息API函数
Public Const HORZRES = 8
‘三个屏幕常量
Public Const VHORZRES = 10
Public Const BITSPIXEL = 12
‘---------------通过字符COPY进行数据类型转换--------------
Private Declare Function lstrcpy Lib "kernel32"
dmFormName As String * CCHFORMNAME
dmUnusedPadding As Integer
dmBitsPerPel As Integer
dmPelsWidth As Long
dmPelsHeight As Long
dmDisplayFlags As Long
.dmFields = DM_PELSWIDTH Or DM_PELSHEIGHT
Else
‘如果Color不等0则改变屏幕的分辨率和色彩。
.dmFields = DM_PELSWIDTH Or DM_PELSHEIGHT Or DM_BITSPERPEL
End If
.dmPelsWidth = Width
Const DM_BITSPERPEL = &H40000
Dim NewDevMode As DEVMODE
Dim pDevmode As Long
With NewDevMode
.dmSize = 122
If Color = 0 Then
‘如果Color=0则只改变屏幕的分辨率,而不改变色彩。
‘恢复最初屏幕设置
SetDispMode Cint(H), Cint(V), Cint(Color)
End Sub
---- 四、将程序编译执行。
---- 本程序执行后,如果单击Command1,则您的计算机屏幕显示模式将被设置为“800x600x16”的显示模式;如果单击Command2, 则您的计算机屏幕显示模式将被设置为原来的显示模式。此程序稍加修改,即可放置于桌面或任务栏中,直接快捷的修改屏幕设置。
.dmPelsHeight = Height
If Color 0 Then
.dmBitsPerPel = Color
End If
End With
pDevmode = lstrcpy(NewDevMode, NewDevMode)
‘得到一个指向NewDevMode结构的Long型的指针。
dmFields As Long
dmOrientation As Integer
dmPaperSize As Integer
dmPaperLength As Integer
dmPaperWidth As Integer
dmScale As Integer
dmCopies As Integer
dmDefaultSource As Integer
dmPrintQuality As Integer
dmColor As Integer
dmDuplex As Integer
dmYResolution As Integer
dmTTOption As Integer
dmCollate As Integer
ChangeDisplaySettings pDevmode, 0
End Function
---- 三、在工程窗体中,加入两个按钮Command1和Command2,其Caption属性分别为“800x600x16”和“恢复原设置”。
---- 其程序代码为:
‘窗口的“通用|声明”区
Option Explicit
Color = GetDeviceCaps(Form1.hdc, BITSPIXEL)
End Sub
Private Sub Command1_Click()
‘调用SetDispMode函数改变屏幕设置
SetDispMode 800, 600, 16
End Sub
Private Sub Command2_Click()
dmDisplayFrequency As Long
End Type
‘------------------设置屏幕的核心API-----------------
Private Declare Function ChangeDisplaySettings
Lib "User32" Alias "ChangeDisplaySettingsA"
(SetDispMode是自己构造的更改屏幕设置的函数来,
它的三个参数Width、Height和Color分别是屏幕的横向分辨率、
纵向分辨率,颜色位数,其值可为24,16,0等。0为原有颜色设置。)
Const DM_PELSWIDTH = &H80000
Const DM_PELSHEIGHT = &H100000
相关文档
最新文档