C#怎么使用windows的API?给个例子,谢谢(100分)

  • 主题发起人 主题发起人 jhonguy
  • 开始时间 开始时间
J

jhonguy

Unregistered / Unconfirmed
GUEST, unregistred user!
rt:C#怎么使用windows的API?给个例子,谢谢
 
代码:
[DllImport("gdi32.dll")]
private  static extern int  AbortDoc(int  hdc);
 
那结构定义呢?
比如:WAVEFORMATEX在C#中是怎么引入?或者是在那个名字空间下?还是怎样呀?
谢谢
 
WaveFormat:
代码:
[StructLayout(LayoutKind.Sequential)] 
private  struct WAVEFORMAT{
private int  wFormatTag;
private int  nChannels;
private int  nSamplesPerSec;
private int  nAvgbyte sPerSec;
private int  nBlockAlign;
}
 
演练:调用 Windows API请参见
Declare 语句剖析 | Declare 语句 | DllImportAttribute 类 | MarshalAsAttribute 类 | Auto | Alias | Lib | COM Interop | 在托管代码中创建原型 | Callback 示例Windows API 是作为 Windows 操作系统一部分的动态链接库 (DLL)。当难以自己编写等效的过程时,可以使用它们来执行任务。例如,Windows 提供一个名为 FlashWindowEx 的函数,能够使您让应用程序的标题栏交替显现深色和浅色。
在代码中使用 Windows API 的好处在于它们可以节省开发时间,因为它们包含许多已经编写好的、等待使用的有用函数。缺点是在发生故障时,Windows API 可能难以处理并且不可挽回。
Windows 动态链接库 (DLL) 表示一个专门的互操作类别。Windows API 不使用托管代码,不具备内置类型库,它使用的数据类型与 Visual Studio .NET 中所用的数据类型不同。由于这些差别,且 Windows API 不是 COM 对象,所以与 Windows API 和 .NET 平台的互操作是通过使用平台调用 (PInvoke) 来完成的。平台调用是一种服务,它使托管代码能够调用 DLL 中实现的非托管函数。有关更多信息,请参见使用非托管 DLL 函数。通过使用 Declare 语句或将 DllImport 属性应用到一个空过程,可以在 Visual Basic .NET 中使用 PInvoke。
Windows API 调用过去曾是 Visual Basic 编程中很重要的一部分,但在 Visual Basic .NET 几乎不必要了。只要有可能,应该使用 .NET Framework 中的托管代码而不是 Windows API 调用来执行任务。本演练提供有关那些一定要使用 Windows API 的场合的信息。
使用 Declare 的 API 调用
调用 Windows API 最常用的方法是通过使用 Declare 语句。
声明 DLL 过程
确定要调用的函数的名称及其参数、参数类型和返回值,以及包含该函数的 DLL 的名称和位置。
注意 有关 Windows API 的完整信息,请参见 Platform SDK Windows API 中的 Win32 SDK 文档。有关 Windows API 使用的常数的更多信息,请检查包含在 Platform SDK 中的头文件,如 Windows.h。
通过在“文件”菜单上单击“新建”,然后单击“项目”,打开一个新的“Windows 应用程序”项目。将出现“新建项目”对话框。
从 Visual Basic 项目模板的列表中选择“Windows 应用程序”。将显示新项目。
将以下 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
 
使用 DllImport 的 API 调用
DllImport 属性提供了在没有类型库的 DLL 中调用函数第二种方法。DllImport 大致等效于使用 Declare 语句,但它在如何调用函数方面提供了更多的控制。
可以将大多数 Windows API 调用与 DllImport 一起使用,只要该调用引用的是共享(有时称为“静态”)方法就可以。不能使用需要类实例的方法。与 Declare 语句不同,DllImport 调用不能使用 MarshalAs 属性。
使用 DllImport 属性调用 Windows API
通过在“文件”菜单上单击“新建”,然后单击“项目”,打开一个新的“Windows 应用程序”项目。将出现“新建项目”对话框。
从 Visual Basic 项目模板的列表中选择“Windows 应用程序”。将显示新项目。
将一个名为 Button2 的按钮添加到启动窗体上。
双击 Button2 打开窗体的代码视图。
要简化对 DllImport 的访问,请向启动窗口类的代码顶部添加一条 Imports 语句:
Imports System.Runtime.InteropServices
在 End Class 语句之前为窗体声明一个空函数,并将函数命名为 MoveFile。
将 Public 和 Shared 修饰符应用到函数声明中,并基于 Windows API 函数使用的参数来设置 MoveFile 的参数:
Public Shared Function _
MoveFile(ByVal src As String, ByVal dst As String) As Boolean
' Leave the body of the function empty.
End Sub
函数可以有任意一个有效的过程名;DllImport 属性指定 DLL 中的名称。它还为参数和返回值处理互操作封送处理,因此可以选择与 API 使用的数据类型相似的 Visual Studio .NET 数据类型。
将 DllImport 属性应用到空函数中。第一个参数是包含要调用的函数的 DLL 的名称和位置。不必为位于 Windows 系统目录下的文件指定路径。第二个参数是一个命名参数,指定 Windows API 中的函数名称:
<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
' This function copies a file from the path src to the path dst.
' Leave function empty - DllImport attribute forces calls
' to MoveFile to be forwarded to MoveFileW in KERNEL32.DLL.
End Function
将代码添加到 Button2_Click 事件处理程序以调用函数:
Private Sub Button2_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) _
Handles Button2.Click
Dim RetVal As Boolean
RetVal = MoveFile("c:/tmp/Test.txt", "c:/Test.txt")
If RetVal = True then
MsgBox("The file was moved successfully.")
else
MsgBox("The file could not be moved.")
End If
End Sub
创建名为 Test.Txt 的文件并将其放在您硬盘的 C:/Tmp 目录下。如果有必要,可创建 Tmp 目录。
按 F5 键启动该应用程序。将显示主窗体。
单击 Button2。若文件可以移动,则显示“The file was moved successfully”。
 
ms-help://MS.VSCC.2003/MS.MSDNQTR.2003FEB.2052/vbcn7/html/vaconCallingWindowsAPIs.htm
 
调用API:
public class Form1 : System.Windows.Forms.Form
{
private System.Windows.Forms.Button button1;
。。。。。。。
private void button1_Click(object sender, System.EventArgs e)
{
Api.sndPlaySound("alarm.wav",1);
}
}
public class Api
{
//播放声音
[DllImport("Winmm")]
public static extern bool sndPlaySound(string lpszSound, uint fuSound);
}
WAVEFORMATEX的 引入方法:
在项目的引用中添加com --> DirectX ? for Visual Basic Type Library
然后在用到WAVEFORMATEX结构的cs文件的开头添加: using DxVBLib;
 
感觉似乎是比原来的开发习惯麻烦了
 
后退
顶部