27.1 API的声明
Posted VB.Net
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了27.1 API的声明相关的知识,希望对你有一定的参考价值。
API调用前必须先进行声明。
一种方法是使用Declare的声明方式,这也是老vb的方式。
[Public/Private/Protected/Friend] [Shadows] [Overloads] Declare [Ansi/Unicode/Auto] Function/Sub API函数名 Lib “调用的动态链接库文件” Alias “API函数别名” (相关参数) As 返回的类型
其中,[](中括号)之间的是可选参数。
例如:
Public Declare Function RemoveMenu Lib "user32" (ByVal hMenu As Integer, ByVal nPosition As Integer, ByVal wFlags As Integer) As Integer
注意:老版本的Visual Basic允许声明参数为Any,这表示可以使用任何数据类型的数据。但是Vb.Net必须使用特定的数据类型,不允许使用Any。
另外一种方法是使用DllImport类的声明方式。由于使用DllImport属性,所以这种方式需要增加System.Runtime.InteropServices。
<DLLImport(“调用的动态链接库文件”,EntryPoint:=”API函数名”, ……(其它DllImportAttribute类字段)>[Public/Private/Protected/Friend] [Shadows] [Shared] Function/Sub API函数名 (相关参数) As 返回的类型
End Function/Sub
其中,DllImportAttribute类使用:=(冒号和等号)设置对应值,它包含以下常用字段:
- CharSet:指示如何向方法封送字符串参数,并控制名称重整。
- EntryPoint:指示要调用的DLL入口点的名称或序号。
- SetLastError:指示被调用方在从特性化方法返回之前是否调用SetLastError Win32 API函数。
例如:
<DllImport("user32.dll", EntryPoint:="GetSystemMenu", SetLastError:=True, CharSet:=CharSet.Auto)>
Public Function GetSystemMenu(ByVal hwnd As Integer, ByVal bRevert As Integer) As Integer
End Function
需要注意的是,如果以上例子中的声明,如果是在窗体代码中,那么应该加上Shared:
<DllImport("user32.dll", EntryPoint:="GetSystemMenu", SetLastError:=True, CharSet:=CharSet.Auto)>
Public Shared Function GetSystemMenu(ByVal hwnd As Integer, ByVal bRevert As Integer) As Integer
End Function
【例 27A.1】【项目:code27A-001】设置记事本窗体的关闭按钮不可用。
在此代码中有两个窗体是相同的,但API的声明部分分别采用了以上两种方式。
窗体1中的代码:
Public Declare Function RemoveMenu Lib "user32" (ByVal hMenu As Integer, ByVal nPosition As Integer, ByVal wFlags As Integer) As Integer
Public Declare Function GetSystemMenu Lib "user32" (ByVal hwnd As Integer, ByVal bRevert As Integer) As Integer
Public Const SC_CLOSE = &HF060
'禁用窗口的关闭按钮
Public Sub DisabledX(ByVal winHandle As Integer)
Dim menuHandle As Integer
menuHandle = GetSystemMenu(winHandle, 0)
Dim result As Integer = RemoveMenu(menuHandle, SC_CLOSE, &H0)
End Sub
'启用窗口的关闭按钮
Public Sub EnabledX(ByVal winHandle As Integer)
Dim menuHandle As Integer
menuHandle = GetSystemMenu(winHandle, 1)
Dim result As Integer = RemoveMenu(menuHandle, SC_CLOSE, &H0)
End Sub
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
For Each pro As Process In Process.GetProcesses
If pro.ProcessName = "notepad" Then
Dim lvPro As New ListViewItem(pro.ProcessName)
lvPro.SubItems.Add(pro.Id)
lvPro.SubItems.Add(pro.MainWindowHandle)
ListView1.Items.Add(lvPro)
End If
Next
End Sub
Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
Dim apphandle As Integer = Integer.Parse(ListView1.SelectedItems(0).SubItems(2).Text)
DisabledX(apphandle)
End Sub
Private Sub Button3_Click(sender As Object, e As EventArgs) Handles Button3.Click
Dim apphandle As Integer = Integer.Parse(ListView1.SelectedItems(0).SubItems(2).Text)
EnabledX(apphandle)
End Sub
窗体2中的代码:
<DllImport("user32.dll", EntryPoint:="RemoveMenu", SetLastError:=True, CharSet:=CharSet.Auto)>
Public Shared Function RemoveMenu(ByVal hMenu As Integer, ByVal nPosition As Integer, ByVal wFlags As Integer) As Integer
End Function
<DllImport("user32.dll", EntryPoint:="GetSystemMenu", SetLastError:=True, CharSet:=CharSet.Auto)>
Public Shared Function GetSystemMenu(ByVal hwnd As Integer, ByVal bRevert As Integer) As Integer
End Function
……其余代码同窗体1
运行结果如下图所示:
由于.net平台下C#和vb.NET很相似,本文也可以为C#爱好者提供参考。
学习更多vb.net知识,请参看vb.net 教程 目录
以上是关于27.1 API的声明的主要内容,如果未能解决你的问题,请参考以下文章
ubuntu 20.04 上的 Emacs 27.1 找不到任何字体
faker.js 登 GitHub 趋势榜标星 27.1k,可大批量生成假数据!