VB对于win32 API的支持还是不错的。而且比起用C++来说还简化了不少。建议你看些windows系统机制的资料,比如windows消息处理机制,windows窗口过程的实现等。最好是去看看MFC的教程,会让你对win32 API有更深入的了解。推荐孙鑫的《VC++深入详解》,给其他窗体发送消息,钩子什么的都有详细的解释。
创新互联公司是一家专业提供铜梁企业网站建设,专注与成都网站建设、成都做网站、H5页面制作、小程序制作等业务。10年已为铜梁众多企业、政府机构等服务。创新互联专业的建站公司优惠进行中。
关于做钩子,使用SetWindowsHookEx,UnhookWindowsHookEx,CallNextHookEx,CopyMemory四个win32 API函数,再加上一个自己写的回调函数就可以实现。
控制别的窗体最小化,给其他窗体发送消息,首先用FindWindow函数找到目标窗体的句柄(对于VB自己的窗体来说Me.hwnd属性),然后用SendMessage,PostMessage函数发送消息。还可以用SetWindowText但是windows消息有几百种,各种消息的参数可能是不同的。要查MSDN搞懂你要使用的消息的参数结构。
代码:关闭其他窗口:
模块中的声明:
Public Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
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
Public Const WM_CLOSE = H10 '定义消息常量
窗体中:
Dim hnd As Long '定义一个长整型变量储存句柄
Private Sub Form_Load()
hnd = FindWindow(vbNullString, "test") '获取目标窗体句柄,这里目标窗体的标题为"test"
SendMessage hnd, WM_CLOSE, 0, 0 '发送WM_CLOSE消息关闭窗体
End Sub
API(Advanced Programmers Interface,高级程序员接口)(注:API实际是指Application Programming Interface,应用程序编程接口;此处疑为原文错误,不过在VB中也可以这么说吧!)是一套用来控制Windows的各个部件(从桌面的外观到位一个新进程分配的内存)的外观和行为的一套预先定义的Windows函数.用户的每个动作都会引发一个或几个函数的运行以Windows告诉发生了什么.
这在某种程度上很象Windows的天然代码.其他的语言只是提供一种能自动而且更容易的访问API的方法.VB在这方面作了很多工作.它完全隐藏了API并且提供了在Windows环境下编程的一种完全不同的方法.
这也就是说,你用VB写出的每行代码都会被VB转换为API函数传递给Windows.例如,Form1.Print...VB 将会以一定的参数(你的代码中提供的,或是默认参数)调用TextOut 这个API函数.
同样,当你点击窗体上的一个按钮时,Windows会发送一个消息给窗体(这对于你来说是隐藏的),VB获取这个调用并经过分析后生成一个特定事件(Button_Click).
API函数包含在Windows系统目录下的动态连接库文件中(如User32.dll,GDI32.dll,Shell32.dll...).
API 声明
正如在"什么是API"中所说,API函数包含在位于系统目录下的DLL文件中.你可以自己输入API函数的声明,但VB提供了一种更简单的方法,即使用API Text Viewer.
要想在你的工程中声明API函数,只需运行API Text Viewer,打开Win32api.txt(或.MDB如果你已经把它转换成了数据库的话,这样可以加快速度.注:微软的这个文件有很多的不足,你可以试一下本站提供下载的api32.txt),选择"声明",找到所需函数,点击"添加(Add)"并"复制(Copy)",然后粘贴(Paste)到你的工程里.使用预定义的常量和类型也是同样的方法.
你将会遇到一些问题:
假设你想在你的窗体模块中声明一个函数.粘贴然后运行,VB会告诉你:编译错误...Declare 语句不允许作为类或对象模块中的 Public 成员...看起来很糟糕,其实你需要做的只是在声明前面添加一个Private(如 Private Declare Function...).--不要忘了,可是这将使该函数只在该窗体模块可用.
在有些情况下,你会得到"不明确的名称"这样的提示,这是因为函数.常量或其他的什么东西共用了一个名称.由于绝大多数的函数(也可能是全部,我没有验证过)都进行了别名化,亦即意味着你可以通过Alias子句使用其它的而不是他们原有的名称,你只需简单地改变一下函数名称而它仍然可以正常运行.
你可以通过查看VB的Declare语句帮助主题来获取有关Alias的详细说明.
没有Api浏览器,因为VB.NET不推荐使用API,因此Microsoft推荐您使用.NET里面的类和方法(而不是API函数)来实现您的需求。
你可以自己制作一个浏览器:
把VB6.0安装目录下的Common\Tools\Winapi下的文件拷贝到任一目录,再把VB6.0所在操作系统下的System32\DBGrid.ocx拷贝到VB.NET所在操作系统下的System32目录下,再直接运行你刚才拷贝过来的APILOAD.exe就可以了。
(1).使用DllImport特征类来申明Windows API函数:
下面是在Visual Basic .Net中使用DllImport特征类申明二个Windows API函数的具体示例:
'函数ExtractIcon,其功能是是从指定文件的指定位置导出图标的Windows句柄。
< System.Runtime.InteropServices.DllImport ( "Shell32.dll" , EntryPoint := "ExtractIcon" ) > _
Public Function _
ExtractIcon ( ByVal src As System.IntPtr , ByVal strFileName As string , ByVal uiIconIndex As UInt32 ) As System.IntPtr
End Function
'函数Icon_Num,其功能是获得指定文件中的图标数目
< System.Runtime.InteropServices.DllImport ( "Shell32.dll" , EntryPoint := "ExtractIcon" ) > _
Public Function _
Icon_Num ( ByVal src As System.IntPtr , ByVal strFileName As string , ByVal uiIconIndex As Integer ) As Integer
End Function
在使用DllImport特征类申明Windows API函数时,如果申明的函数名称和函数的入口点相同,则可以在申明Windows API函数时,省略定义函数入口点对应的代码,即EntryPoint对象字段对应的代码,这样声明ExtractIcon函数的代码也可以简化为如下所示:
< System.Runtime.InteropServices.DllImport ( "Shell32.dll" ) > _
Public Function _
ExtractIcon ( ByVal src As System.IntPtr , ByVal strFileName As string , ByVal uiIconIndex As UInt32 ) As System.IntPtr
End Function
(2).使用“Declare”语句来申明Windows API函数:
使用“Declare”语句的确比使用DllImport特征类要简单了许多,下面是在Visual Basic .Net中使用“Declare”语句来声明上述二个Windows API函数的具体方法:
Declare Auto Function ExtractIcon Lib "Shell32.dll" Alias "ExtractIcon" ( ByVal src As System.IntPtr , ByVal strFileName As string , ByVal uiIconIndex As UInt32 ) As System.IntPtr
'声明ExtractIcon函数
Declare Auto Function Icon_Num Lib "Shell32.dll" Alias "ExtractIcon" ( ByVal src As System.IntPtr , ByVal strFileName As string , ByVal uiIconIndex As Integer ) As Integer
'声明Icon_Num函数
在Visual Basic .Net中声明Windows API函数时,“Declare”语句中Alias关键字的作用相当于使用DllImport特征类中的EntryPoint对象字段。同样在使用“Declare”语句声明Windows API函数时,如果声明的函数和函数的入口点相同,也可以省略Alias关键字对应的代码,所以ExtractIcon函数也可以简化为如下:
Declare Auto Function ExtractIcon Lib "Shell32.dll" ( ByVal src As System.IntPtr , ByVal strFileName As string , ByVal uiIconIndex As UInt32 ) As System.IntPtr