dotNET C# Programmer’s Guide to the Win32 API (Win32 API 声明C#版)

原创 2001年09月07日 21:30:00

dotNET C# Programmer’s Guide to the Win32 API (Win32 API 声明C#)

<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

 

小气的神  2001.09.07

 

噢,对不起我用了这个标题,事实上如果我能做到10%,我就很高兴了。因为我的桌上正放着一本Dan Appleman的书,它曾伴随我许多年,也许你也有一本:1215页,蓝色书皮,机械工业出版社。英文名叫:《 Dan Appleman’s Visual Basic 5.0 Programmer’s Guide to the Win32 API 》。而我除了借用这个类似的名字之外,只是做了一下整理工作,不过这是一个不小的工作量(haha)

 

    我把KERNEL32.DLLUSER32.DLLGDI32.DLL ADVAPI32.DLLSHELL32.DLLSPOOLSS.DLLWINMM.DLL的函数和声明整理了一下,改用C#的语法重新改写了一遍,整理出一个C#版本。这样针对dotNETPlatform Invocation Services(PInVoke),你就可以直接使用这些Win32API函数了。目前MS没有公布整个的Win32API有多少可以在dotNET中使用,有多少不行。有些功能在dotNET中没有对应的实现,那么目前你可能还需要使用Win32API函数。

 

    结构和枚举声明放在一起,Kernel32.dllUser32.DllGDI32.dll分别放在3cs文件中;剩下的Advapi32.dllShell32.dllSpoolss.dllWinmm.dll四个DLL的函数放在一个cs文件中,整个的namespace 起名叫Win32API.大致的构架应该象下面这样:

namespace Win32API {

 

    using System;

    using System.Runtime.InteropServices;

 

先是所有的结构和枚举声明

class Kernel32 {….}

class User32 {….}

class GDI32 {….}

class Advapi32 {….}

class Shell32 {….}

class Spoolss {….}

class Winmm {….}

}

 

对应的生成下面的C#文件:

Structs.NET.cs

Kernel32.NET.cs

User32.NET.cs

GDI32.NET.cs

OtherFnc.NET.cs

 

然后编译它们,这样就可以使用它们了,我没有计算5个文件包括的所有的准确个数,不过应该有百个结构和枚举,上千个函数声明吧。完成这些之后,现在最常用的MessageBox我可以这样使用了:

 

using System ;

using Win32API;

 

public class TestWin32API

{

    public static void <?xml:namespace prefix = st1 ns = "urn:schemas-microsoft-com:office:smarttags" />Main()

    {

 

        int iRet ;

        iRet = User32.MessageBox( 0, "Hello C# Win32 API" , "My Pinvoke", 0 ) ;

    }

}

 

    就在测试这个例子时发生了一件有趣的事,因为刚开始我的cs文件都没有加NET的标识这样很自然的就有了Kernel32.cs User32.cs等等,MessageBoxUser32.DLL中的,而我编译的User32.cs默认生成的也叫User32.DLL,当我执行这个测试程序时终于发生错误,我一直以为自己的声明有问题,然后我用FrameworkSDK中的例子也还是出错,直到我在其它的目录中运行正常时,我才发现原来自己的DLL名和系统的DLL名完全一样。然后就改成上面的那样,不过很奇怪csc /t:exe /r:User32.dll TestWin32API.cs 的编译指令居然没有错误提示,真是可恶。提醒你不要也象我一样。

    恶梦也许还在后面,我还不知道真正的cs声明中又有多少个错误,反正用到的时候再调试吧。因为太多了所以不可能全都测试,也不敢一个个的测试,只希望自己这些整理能起到抛砖引玉的作用,如果以后你有新的版本,不要忘了Mail一份给我。

 

附带的Zip包中有所有cs的源码,我在Framework SDK Beta2 下都编译通过。

Windows 2000 ADV Server SP2 EN

Visual C# Compiler Version 7.00.9254

CLR version v1.0.2914

你可以根据你的情况进行编译(要先编译Structs.NET.cs,因为其它的都要/r:Structs.NET.DLL)或者使用二进制的DLLdotnet的编译技术很好,5DLL加起来才100K

 

下面是一下源码的节选:

// Write by ccBoy

// Date: 2001.09.07

// csc /t:library /r:System.dll Structs.NET.cs

// csc /t:library /r:Structs.NET.dll Kernel32.NET.cs

// Emeditor 3.14

 

namespace Win32API {

 

    using System;

    using System.Runtime.InteropServices;

 

[StructLayout (LayoutKind.Sequential)]

public class ABC {

        public int abcA;

        public int abcB;

        public int abcC;

}

 

[StructLayout (LayoutKind.Sequential)]

public class ABCFLOAT {

        public float abcfA;

        public float abcfB;

        public float abcfC;

}

 

public Class Kernel32 {

 

       [DllImport("KERNEL32.DLL") ]

        public  static extern int GlobalHandle (int pMem);

 

        [DllImport("KERNEL32.DLL") ]

        public  static extern int GlobalLock (int hMem);

 

        [DllImport("KERNEL32.DLL") ]

        public  static extern void GlobalMemoryStatus (MEMORYSTATUS lpBuffer);

 

        [DllImport("KERNEL32.DLL") ]

        public  static extern int GlobalReAlloc (int hMem, int dwBytes, int uFlags);

 

        [DllImport("KERNEL32.DLL") ]

        public  static extern int GlobalSize (int hMem);

 

        [DllImport("KERNEL32.DLL") ]

        public  static extern bool GlobalUnWire (int hMem);

}

 

public class User32 {

 

        [DllImport("USER32.DLL") ]

        public  static extern bool MessageBeep (int uType);

 

        [DllImport("USER32.DLL") ]

        public  static extern int MessageBoxEx (int hWnd, String lpText, String lpCaption, int uType, short wLanguageId);

 

        [DllImport("USER32.DLL") ]

        public  static extern int MessageBoxIndirect (MSGBOXPARAMS anonymous0);

 

        [DllImport("USER32") ]

        public  static extern int MessageBox (int hWnd, String lpText, String lpCaption, int uType);

}

 

pubic class Winmm {

 

        [DllImport("WINMM.DLL") ]

        public  static extern int SendDriverMessage (int hDriver, int message, int lParam1, int lParam2);

 

        [DllImport("WINMM.DLL") ]

        public  static extern int auxGetDevCaps (int uDeviceID, AUXCAPS pac, int cbac);

 

        [DllImport("WINMM.DLL") ]

        public  static extern int auxGetNumDevs ();

 

        [DllImport("WINMM.DLL") ]

        public  static extern int auxGetVolume (int uDeviceID, int[] pdwVolume);

 

        [DllImport("WINMM.DLL") ]

        public  static extern int auxOutMessage (int uDeviceID, int uMsg, int dw1, int dw2);

 

        [DllImport("WINMM.DLL") ]

        public  static extern int auxSetVolume (int uDeviceID, int dwVolume);

}

    .,. ..,. ..,.. ..,..,.. ,.   ..,. ..,.. ..,..,.. 太多太多hahaha..

}

[转贴]dotNET C# Programmer’s Guide to the Win32 API (Win32 API 声明C#版)

dotNET C# Programmer’s Guide to the Win32 API (Win32 API 声明C#版) 作者:小气的神      噢,对不起我用了这个标题,事实上如果我能做到1...
  • metababy
  • metababy
  • 2005年12月30日 18:32
  • 1439

图解C# 调用Win32 API 示例程序

先上代码;相关函数不解释;网上比较容易查到; using System; using System.Collections.Generic; using System.ComponentModel; ...
  • bcbobo21cn
  • bcbobo21cn
  • 2016年04月21日 22:18
  • 1091

dotNET C# Programmer’s Guide to the Win32 API (Win

  • zgqtxwd
  • zgqtxwd
  • 2008年05月01日 03:33
  • 102

C#调用Win32 api学习总结

从.NET平台调用Win32 API         Win32 API可以直接控制Microsoft Windows的核心,因为API(Application Programming Inte...
  • bcbobo21cn
  • bcbobo21cn
  • 2016年03月19日 11:39
  • 4222

C# win32 API编程(超详细)

C# win32 API编程 C# 用户经常提出两个问题:“我为什么要另外编写代码来使用内置于 Windows 中的功能?在框架中为什么没有相应的内容可以为我完成这一任务?”当框架小组构建他们的 ....
  • yongping8204
  • yongping8204
  • 2012年02月19日 20:52
  • 2263

在C#中调用windows API函数 最大、最小化窗口

/// /// 最大化窗口,最小化窗口,正常大小窗口; /// [DllImport("user32.dll", EntryPoint="ShowWindow", CharSet=CharSet....
  • xingxing513234072
  • xingxing513234072
  • 2014年02月28日 13:55
  • 4918

Win32 API 封装类总结

以下是一些封装的Win32 API类;备用; 重温WIN32 API ------ 最简单的Windows窗口封装类 http://blog.csdn.net/smstong/arti...
  • bcbobo21cn
  • bcbobo21cn
  • 2016年08月16日 10:56
  • 3705

C#+Win32 API程序控制鼠标的操作 解脱烦重的鼠标繁复操作

命名空间:using System.Runtime.InteropServices; 在程序中添加:         [DllImport("User32")]public e...
  • gengyiping18
  • gengyiping18
  • 2016年04月10日 23:32
  • 1363

C#调用Win32 API如何处理指针类型的参数

0、前言从VB到C#,被人诟病比较多的就是交互性比较差,又集中表现在调用Win32 API上。如果说C/C++调用API只是调用函数这类轻松的活,在C#下却成了阻挡入门者的技术活。之所以产生这么大区别...
  • zhensoft163
  • zhensoft163
  • 2009年04月29日 19:18
  • 8159

C#中使用WIN32API来遍历文件和目录

我们有时需要遍历某个目录下的文件和子目录,可以使用System.IO.DirectoryInfo.GetDirectories或GetFiles来获得目录下的所有的文件和子目录,当这个目录下的内容比较...
  • yandong19861103
  • yandong19861103
  • 2008年03月11日 15:50
  • 554
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:dotNET C# Programmer’s Guide to the Win32 API (Win32 API 声明C#版)
举报原因:
原因补充:

(最多只允许输入30个字)