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

  • :aspxer  Դ:internet  :2007-5-7 13:28:26  ؼ:c#
  • [DllImport("User32.dll")]

    public static extern void GetSystemTime(MySystemTime st);

    }

    回调函数的传递:

    从受管辖的代码中调用大多数动态链接库函数,你只需创建一个受管辖的函数定义,然后调用它即可,这个过程非常直接。

    如果一个动态链接库函数需要一个函数指针作为参数,你还需要做以下几步:

    首先,你必须参考有关这个函数的文档,确定这个函数是否需要一个回调;第二,你必须在受管辖代码中创建一个回调函数;最后,你可以把指向这个函数的指针作为一个参数创递给DLL函数,.

    回调函数及其实现:

    回调函数经常用在任务需要重复执行的场合,譬如用于枚举函数,譬如Win32 API 中的EnumFontFamilies(字体枚举), EnumPrinters(打印机), EnumWindows (窗口枚举)函数. 下面以窗口枚举为例,谈谈如何通过调用EnumWindow 函数遍历系统中存在的所有窗口

    分下面几个步骤:

    1. 在实现调用前先参考函数的声明

    BOOL EnumWindows(WNDENUMPROC lpEnumFunc, LPARMAM IParam)

    显然这个函数需要一个回调函数地址作为参数.

    2. 创建一个受管辖的回调函数,这个例子声明为代表类型(delegate),也就是我们所说的回调,它带有两个参数hwnd和lparam,第一个参数是一个窗口句柄,第二个参数由应用程序定义,两个参数均为整形。

    当这个回调函数返回一个非零值时,标示执行成功,零则暗示失败,这个例子总是返回True值,以便持续枚举。

    3. 最后创建以代表对象(delegate),并把它作为一个参数传递给EnumWindows 函数,平台会自动地 把代表转化成函数能够识别的回调格式。

    [C#]

    using System;

    using System.Runtime.InteropServices;

    public delegate bool CallBack(int hwnd, int lParam);

    public class EnumReportApp {

    [DllImport("user32")]

    public static extern int EnumWindows(CallBack x, int y);

    public static void Main()

    {

    CallBack myCallBack = new CallBack(EnumReportApp.Report);

    EnumWindows(myCallBack, 0);

    }

    public static bool Report(int hwnd, int lParam) {

    Console.Write("窗口句柄为");

    Console.WriteLine(hwnd);

    return true;

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