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 教程 目录

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值