• λ我爱Aspx >> C#.Net >> 用Visual C#调用Windows API函数
  • 用Visual C#调用Windows API函数

  • :aspxer  Դ:internet  :2007-5-7 13:28:26  ؼ:c#
  • 下面是一个用MsgBox替换MessageBox名字的例子:

    [C#]

    using System.Runtime.InteropServices;

    public class Win32 {

    [DllImport("user32.dll", EntryPoint="MessageBox")]

    public static extern int MsgBox(int hWnd, String text, String caption, uint type);

    }

    许多受管辖的动态链接库函数期望你能够传递一个复杂的参数类型给函数,譬如一个用户定义的结构类型成员或者受管辖代码定义的一个类成员,这时你必须提供额外的信息格式化这个类型,以保持参数原有的布局和对齐。

    C#提供了一个StructLayoutAttribute类,通过它你可以定义自己的格式化类型,在受管辖代码中,格式化类型是一个用StructLayoutAttribute说明的结构或类成员,通过它能够保证其内部成员预期的布局信息。布局的选项共有三种:

    布局选项

    描述

    LayoutKind.Automatic

    为了提高效率允许运行态对类型成员重新排序。

    注意:永远不要使用这个选项来调用不受管辖的动态链接库函数。

    LayoutKind.Explicit

    对每个域按照FieldOffset属性对类型成员排序

    LayoutKind.Sequential

    对出现在受管辖类型定义地方的不受管辖内存中的类型成员进行排序。

    传递结构成员

    下面的例子说明如何在受管辖代码中定义一个点和矩形类型,并作为一个参数传递给User32.dll库中的PtInRect函数,

    函数的不受管辖原型声明如下:

    BOOL PtInRect(const RECT *lprc, POINT pt);

    注意你必须通过引用传递Rect结构参数,因为函数需要一个Rect的结构指针。

    [C#]

    using System.Runtime.InteropServices;

    [StructLayout(LayoutKind.Sequential)]

    public struct Point {

    public int x;

    public int y;

    }

    [StructLayout(LayoutKind.Explicit]

    public struct Rect {

    [FieldOffset(0)] public int left;

    [FieldOffset(4)] public int top;

    [FieldOffset(8)] public int right;

    [FieldOffset(12)] public int bottom;

    }

    class Win32API {

    Ҷƪл˵?
  • һƪC#写的ADSL拨号程序示例
    һƪ编写C#程序实现动态系统托盘图标