-
vb.net 教程 2-13 Windows API 函数
版权声明:本文为博主原创文章,转载请在显著位置标明本文出处以及作者网名,未经作者允许不得用于商业目的。
API(Application Programming Interface,应用程序编程接口)函数是提供给开发人员访问某个功能或者硬件的接口。通常情况下,API是封装在动态链接库(Dll文件)内的,
通俗来说,api函数相当于是个黑匣子,外部的开发人员通过调用提供的api函数而获得某些功能,而内部的开发人员也不用担心泄漏源代码,也能更好地控制外部开发人员访问的权限。
.net开发为什么还要调用api函数?
相对于vb6及之前版本,.net框架提供给了开发者很多功能,但是仍然有相当部分系统功能只能通过调用api完成。
我的理解:从本质上来说,.net框架也是调用的api,不过提供给了开发人员更为简便的方法,开发者只需要使用.net提供的函数就可以了。
如何知道系统提供哪些API函数?
一个方法是,在vb6中提供了api函数浏览器,实际可以把这个有用的东东拷贝使用。
有所区别的是数据类型不一样。
比如:vb6下的Long(这也是api中常见的类型,指针、句柄都用它)在vb.net中是Integer。
例如:禁用窗口关闭按钮相关的Api函数:
Private Declare Function GetSystemMenu Lib "user32" (ByVal hwnd As Long, ByVal bRevert As Long) As Long
翻译到vb.net中应该是:
Private Declare Function GetSystemMenu Lib "user32.dll" (ByVal hwnd As Integer, ByVal bRevert As Integer)As Integer
其次,可以在网上搜索适合vb.net的相关api声明。
如何调用api函数
vb.net下提供了两种方法:
一是按照vb6及之前的方式:
Private Declare Function GetSystemMenu Lib "user32.dll" (ByVal hwnd As Integer, ByVal bRevert As Boolean) As Integer
二是使用DllImport方式
<DllImport("user32", CharSet:=CharSet.Auto, SetLastError:=True, ExactSpelling:=True)>
Private Shared Function GetSystemMenu(ByVal hwnd As Integer, ByVal revert As Integer) As Integer
End Function
使用此方式时应该注意
Imports System.Runtime.InteropServices
同时,“, CharSet:=CharSet.Auto, SetLastError:=True, ExactSpelling:=True”并非必须的。
这里以禁用窗口的关闭按钮(X)为例:
新建一个窗口,上面放两个按钮。
定义API函数部分(第二种方式被我注释掉,可以把注释部分取消注释替换第一种方式):
Private Declare Function GetSystemMenu Lib "user32.dll" (ByVal hwnd As Integer, ByVal bRevert As Integer) As Integer
'<DllImport("user32", CharSet:=CharSet.Auto, SetLastError:=True, ExactSpelling:=True)>
'Private Shared Function GetSystemMenu(ByVal hwnd As Integer, ByVal revert As Integer) As Integer
'End Function
Private Declare Function EnableMenuItem Lib "user32.dll" (ByVal menu As Integer, ByVal ideEnableItem As Integer, ByVal enable As Integer) As Integer
'<DllImport("user32", CharSet:=CharSet.Auto, SetLastError:=True, ExactSpelling:=True)>
'Private Shared Function EnableMenuItem(ByVal menu As Integer, ByVal ideEnableItem As Integer, ByVal enable As Integer) As Integer
'End Function
Private Const SC_CLOSE As Integer = &HF060
Private Const MF_BYCOMMAND As Integer = &H0
Private Const MF_ENABLED As Integer = &H0
Private Const MF_GRAYED As Integer = &H1
Private Const MF_DISABLED As Integer = &H2
Private Const MF_REMOVE = &H1000
按钮部分:
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
Dim result As Integer = GetSystemMenu(Me.Handle, 0)
Dim result2 As Integer = EnableMenuItem(result, SC_CLOSE, MF_BYCOMMAND Or MF_GRAYED)
End Sub
Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
Dim result As Integer = GetSystemMenu(Me.Handle, 0)
Dim result2 As Integer = EnableMenuItem(result, SC_CLOSE, MF_BYCOMMAND Or MF_ENABLED)
End Sub
button1使关闭按钮禁用,button2恢复关闭按钮。
按下button1时候:
由于.net平台下C#和vb.NET很相似,本文也可以为C#爱好者提供参考。
学习更多vb.net知识,请参看vb.net 教程 目录
————————————————
版权声明:本文为CSDN博主「VB.Net」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/uruseibest/article/details/79265246
最新更新
求1000阶乘的结果末尾有多少个0
详解MyBatis延迟加载是如何实现的
IDEA 控制台中文乱码4种解决方案
SpringBoot中版本兼容性处理的实现示例
Spring的IOC解决程序耦合的实现
详解Spring多数据源如何切换
Java报错:UnsupportedOperationException in Col
使用Spring Batch实现批处理任务的详细教程
java中怎么将多个音频文件拼接合成一个
SpringBoot整合ES多个精确值查询 terms功能实
数据库审计与智能监控:从日志分析到异
SQL Server 中的数据类型隐式转换问题
SQL Server中T-SQL 数据类型转换详解
sqlserver 数据类型转换小实验
SQL Server数据类型转换方法
SQL Server 2017无法连接到服务器的问题解决
SQLServer地址搜索性能优化
Sql Server查询性能优化之不可小觑的书签查
SQL Server数据库的高性能优化经验总结
SQL SERVER性能优化综述(很好的总结,不要错
uniapp/H5 获取手机桌面壁纸 (静态壁纸)
[前端] DNS解析与优化
为什么在js中需要添加addEventListener()?
JS模块化系统
js通过Object.defineProperty() 定义和控制对象
这是目前我见过最好的跨域解决方案!
减少回流与重绘
减少回流与重绘
如何使用KrpanoToolJS在浏览器切图
performance.now() 与 Date.now() 对比