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类使用:=(冒号和等号)设置对应值,它包含以下常用字段:

  1. CharSet:指示如何向方法封送字符串参数,并控制名称重整。
  2. EntryPoint:指示要调用的DLL入口点的名称或序号。
  3. 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,可大批量生成假数据!

27.Docker技术入门与实战 --- Kubernetes—生产级容器集群平台

因一段JavaScript无限循环代码,13岁女学生被捕;8亿邮件地址遭泄露;Guava 27.1 正式发布

Xcode 指示 C++ 不存在的已删除变量的未声明标识符错误

厌倦了写活动页的学弟学妹们快来看看,这个页面构建工具忒牛,Github标星27.1k