调用 Windows Api
indows Api 是动态链接库 (Dll) 的 Windows 操作系统的一部分。 您可以使用它们来执行任务时很难编写你自己的等效过程。 例如,Windows 提供了一个名为函数FlashWindowEx允许您进行应用程序的标题栏在浅色和深色阴影之间切换。
在代码中使用 Windows Api 的优点是它们可以节省开发时间,因为它们包含大量有用的功能,已编写并等待使用。 缺点是 Windows Api 可能很难处理和铁面无私时出现问题。
Windows Api 表示一类特殊的互操作性。 Windows Api 不使用托管的代码,没有内置类型库,并使用不同于与用于 Visual Studio 的数据类型。 鉴于这些区别,因为 Windows Api 不是 COM 对象,与 Windows Api互操作性 和 .NET Framework使用平台执行的调用,简称 PInvoke。 平台调用是一项服务,它使托管代码能够调用非托管的 Dll 中实现的函数。 有关详细信息,请参阅使用非托管 DLL 函数。 可以通过使用 Visual Basic 中使用 PInvokeDeclare语句或将应用DllImport属性为空的过程。

调用 Windows Api 的最常见方法是使用Declare语句。
若要声明 DLL 过程
确定你想要调用,该函数及其参数、 参数类型的名称和返回值,以及名称和包含该 DLL 的位置。

有关 Windows Api 的完整信息,请参阅平台 SDK Windows API 中的 Win32 SDK 文档。 有关 Windows Api 使用的常量的详细信息,检查如 Windows.h Platform SDK 中包含的标头文件。
通过单击打开一个新的 Windows 应用程序项目新建上文件菜单中,然后单击项目。 此时将出现“新建项目”对话框。
选择Windows 应用程序从 Visual Basic 项目模板的列表。 显示新的项目。
以下代码添加到Declare函数到类或想要使用该 DLL 的模块:

Declare Auto Function MBox Lib "user32.dll" Alias "MessageBox" (
ByVal hWnd As Integer,
ByVal txt As String,
ByVal caption As String,
ByVal Typ As Integer) As Integer

Declare语句包括以下元素。
Auto 修饰符
Auto修饰符指示运行时转换基于根据公共语言运行时规则 (或已指定的别名) 的方法名称的字符串。
Lib 和别名关键字
名称以下Function关键字是您的程序用来访问导入的函数的名称。 它可以是你要调用的函数的真实名称相同,也可以使用任何有效的过程名称,然后使用Alias关键字来指定要调用的函数的真实名称。
指定Lib关键字后, 跟的名称和包含要调用的函数的 DLL 的位置。 不需要指定位于 Windows 系统目录中文件的路径。
使用Alias关键字,如果你正在调用的函数的名称不是有效的 Visual Basic 过程名称,或与你的应用程序中其他项的名称冲突。 Alias 指示要调用的函数的真实名称。
参数和数据类型声明
声明的参数和其数据类型。 此部分会很困难,因为 Windows 使用的数据类型不对应于 Visual Studio 的数据类型。 Visual Basic 通过将参数转换为兼容的数据类型,名为的过程为您完成大量工作封送处理。 您可以显式控制参数使用被封送MarshalAsAttribute属性中定义System.Runtime.InteropServices命名空间。
备注

Visual Basic 的早期版本允许您声明参数As Any,这意味着该数据的任何数据就可以使用类型。 Visual Basic 要求您对所有使用特定的数据类型Declare语句。
Windows API 常量
某些参数是常量的组合。 例如,MessageBox在本演练中所示的 API 接受整数参数名为Typ,它控制如何显示消息框。 可以通过检查来确定这些常量的数值#define文件 WinUser.h 中的语句。 以十六进制格式,通常显示的数字值,因此可能需要使用一个计算器来将它们添加并将转换为十进制。 例如,如果想要合并的感叹号样式的常量MB_ICONEXCLAMATION0x00000030 和是/无样式MB_YESNO0x00000004,可以添加数字并获取结果 0x00000034 52 十进制。 虽然可以直接使用十进制的结果,则最好将这些值声明为你的应用程序中的常量并将其组合使用Or运算符。

若要声明常量 Windows API 调用
要调用的 Windows 函数,请参阅文档。 确定使用的常数的名称以及包含这些常量的数值的.h 文件的名称。
使用文本编辑器,如记事本,若要查看的内容标头 (.h) 文件,并查找与正在使用的常量相关联的值。 例如, MessageBox API 使用常量MB_ICONQUESTION在消息框中显示一个问号。 有关定义MB_ICONQUESTION是在 WinUser.h 中,将出现,如下所示:
#define MB_ICONQUESTION 0x00000020L

添加等效Const到类或模块,以使这些常量可用于应用程序的语句。 例如:
VB

复制
Const MB_ICONQUESTION As Integer = &H20
Const MB_YESNO As Integer = &H4
Const IDYES As Integer = 6
Const IDNO As Integer = 7
若要调用的 DLL 过程
添加名为的按钮Button1启动窗体让你的项目,然后双击它以查看其代码。 显示按钮的事件处理程序。
将代码添加到Click您添加的按钮,调用该过程,并提供适当的参数的事件处理程序:
VB

复制
Private Sub Button1_Click(ByVal sender As System.Object,
ByVal e As System.EventArgs) Handles Button1.Click

' Stores the return value.
Dim RetVal As Integer
RetVal = MBox(0, "Declare DLL Test", "Windows API MessageBox",MB_ICONQUESTION Or MB_YESNO)' Check the return value.
If RetVal = IDYES ThenMsgBox("You chose Yes")
ElseMsgBox("You chose No")
End If

End Sub
通过按 F5 运行项目。 消息框显示两个是并否响应按钮。 单击其中任何一个。
数据封送处理
Visual Basic 会自动将转换的数据类型的参数和返回值为 Windows API 调用,但你可以使用MarshalAs属性来显式指定 API 预期的非托管的数据类型。 关于互操作封送处理的详细信息,请参阅互操作封送处理。
若要在 API 调用中使用 Declare 和 MarshalAs
确定你想要的参数、 调用数据类型的函数的名称和返回值。
若要简化对访问MarshalAs特性,请添加Imports到类或模块,如以下示例所示的代码的顶部的语句:
VB

复制
Imports System.Runtime.InteropServices
将导入的函数的函数原型添加到类或模块使用的,并应用MarshalAs属性为参数或返回值。 在下面的示例中,需要类型的 API 调用void*被封送为AsAny:

Declare Sub SetData Lib "..\LIB\UnmgdLib.dll" (ByVal x As Short,<MarshalAsAttribute(UnmanagedType.AsAny)>ByVal o As Object)

使用 DllImport 的 API 调用
DllImport属性提供不带类型库在 Dll 中调用函数的第二个方法。 DllImport 大致相当于使用Declare语句,但可以更好地控制函数的调用方式。
可以使用DllImport与大多数 Windows API 调用,只要该调用是指在不共享 (有时称为静态) 方法。 不能使用需要的类实例的方法。 与不同Declare语句,DllImport的调用不能使用MarshalAs属性。
若要调用 Windows API 使用 DllImport 特性
通过单击打开一个新的 Windows 应用程序项目新建上文件菜单中,然后单击项目。 此时将出现“新建项目”对话框。
选择Windows 应用程序从 Visual Basic 项目模板的列表。 显示新的项目。
添加名为的按钮Button2到启动窗体。
双击Button2以打开窗体的代码视图。
若要简化对访问DllImport,添加Imports语句启动窗体类的代码的顶部:

Imports System.Runtime.InteropServices

声明一个空的函数,前面End Class窗体,并将函数命名为语句MoveFile。
将应用Public并Shared函数声明和设置的参数的修饰符MoveFile根据 Windows API 函数使用的参数:
VB

Public Shared Function MoveFile(ByVal src As String,ByVal dst As String) As Boolean' Leave the body of the function empty.
End Function

你的函数名称可以是任意有效的过程;DllImport属性在 DLL 中指定的名称。 它还处理互操作封送处理参数和返回值,因此,可以选择 Visual Studio 的数据类型类似于数据的类型 API 使用。
将应用DllImport属性为空函数。 第一个参数是名称和包含要调用的函数的 dll 的位置。 不需要指定位于 Windows 系统目录中文件的路径。 第二个参数是函数的命名的参数,Windows API 中指定的名称。 在此示例中,DllImport属性强制调用MoveFile转发到MoveFileWKERNEL32 中。DLL。 MoveFileW方法将文件复制从路径src到路径dst。
VB

<DllImport("KERNEL32.DLL", EntryPoint:="MoveFileW", SetLastError:=True,CharSet:=CharSet.Unicode, ExactSpelling:=True,CallingConvention:=CallingConvention.StdCall)>
Public Shared Function MoveFile(ByVal src As String,ByVal dst As String) As Boolean' Leave the body of the function empty.
End Function

将代码添加到Button2_Click事件处理程序调用该函数:
VB

Private Sub Button2_Click(ByVal sender As System.Object,ByVal e As System.EventArgs) Handles Button2.ClickDim RetVal As Boolean = MoveFile("c:\tmp\Test.txt", "c:\Test.txt")If RetVal = True ThenMsgBox("The file was moved successfully.")ElseMsgBox("The file could not be moved.")End If
End Sub

创建一个名为 Test.txt 文件并将其放在硬盘上 C:\Tmp 目录中。 如有必要,请创建临时目录。
按 F5 键启动该应用程序。 主窗体显示。
单击Button2。 如果可以移动该文件,则会显示"文件已移动已成功"消息。

.net随笔-vb.net打开外部程序发送键盘信号(2)相关推荐

  1. .net随笔-vb.net打开外部程序发送键盘信号(1)

    Public Class Form1Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.ClickD ...

  2. .net随笔-vb.net打开外部程序发送键盘信号(3)

    使用DllImport Imports System.Runtime.InteropServices Public Class Form1<DllImport("user32.DLL& ...

  3. vb.net2019-打开外部程序发送键盘信号(4)

    使用AsAny可不强制指定类型 Imports System.Runtime.InteropServicesPublic Class Form1Private Declare Auto Functio ...

  4. pyqt5 发送键盘信号_为什么提款机的键盘要用金属?看完之后长知识了……

    瓷都晚报蝉联江西十大最具影响力媒体微信 为什么ATM提款机的按键要用金属? 银行的ATM机一般都是金属数字键盘,它有防止泄密的好处. 想一想:当你用手指按下密码之后,键盘的温度就会被改变.如果我们在交 ...

  5. pyqt5 发送键盘信号_Python教程 | Pyqt5实战教程之操作交互处理,原来这么简单!...

    PyQt5用来编写Python脚本的应用界面.本文详细介绍PyQt5教程之操作交互处理,并通过丰富的实战提高文章的可读性.在教程后面会附带PyQt5操作交互处理常见问题. 一.前言: 不管在PyQt还 ...

  6. VC++ 获取窗体句柄,并发送键盘消息(这种方法也可以打开某些应用程序)

    当我们想得到一个窗口对象(CWnd的派生对象)指针的句柄(HWND)时,最安全的方法是使用GetSafeHwnd()函数,通过下面的例子来看其理由: CWnd *pwnd = FindWindow(_ ...

  7. VB实现向窗口发送按键消息

    VB实现向窗口发送按键消息 : 嵌入式模拟键盘 待解决问题 vb WM_KEYDOWN 参数设置???? id="question_content">Private Decl ...

  8. C#调用API向外部程序发送数据(转载)

    转自:http://www.cnblogs.com/trieagle/p/3811375.html C#调用API向外部程序发送数据 最近有可能要做一个项目.在项目中有这么一个功能,在A程序中调用B程 ...

  9. Unity打开Windows虚拟键盘

    ** Unity打开Windows虚拟键盘 提示:以下是本篇文章正文内容,下面案例可供参考 代码如下: Process.Start(@"C:\WINDOWS\system32\osk.exe ...

最新文章

  1. Oracle 10g 之自动收集统计信息
  2. 商品领域ddd_DDD领域驱动实战 - 限界上下文(bounded context)
  3. 寻找最优参数解:最速下降法,牛顿下降法,阻尼牛顿法,拟牛顿法
  4. java 数组 参数 ppt,Java自学课件-数组.ppt
  5. java活动安排_贪心法求解活动安排(java实现)
  6. css 样式三元运算_20条书写CSS代码的建议
  7. Android—View事件分发与View子类
  8. 数据结构--栈 codevs 1107 等价表达式
  9. 华为-RH5885 V3 远程KVM
  10. matlab安装详解
  11. PHP开发入门 | 简单的PHP新闻管理系统案例
  12. 攒机笔记二十二:台式组装机(2022.9)
  13. 鸿蒙系统深度系统,国产操作系统欢迎你!华为鸿蒙系统与深度deepin操作系统正常亮相...
  14. 【锋利的jQuery】读书笔记
  15. excel批量重命名工作表
  16. Linux【问题记录 05】阿里云+腾讯云服务器挖矿木马 kthreaddk 处理记录+云服务器使用建议
  17. 我的同学是计算机作文,我的同桌作文
  18. 个人项目总结 (By Jun Guo)
  19. 【SpringBoot】Http请求统一异常(返回数据)处理与单元测试
  20. 工业相机标定(张正友标定法)

热门文章

  1. python+selenium自动化测试——浏览器驱动
  2. 从 Vue 1.x 迁移 — Vue.js
  3. spring + shiro + cas 实现sso单点登录
  4. Android:BroadcastReceiver的基础知识
  5. Python于*args 和**kwargs使用
  6. new LayoutParams 使用
  7. 使用JDBC连接SQL Server数据库
  8. sun的没落是悲还是喜?
  9. Turtle库的学习积累
  10. 一年的天数 Exercise06_16