C#获取打印机状态+API函数详解_第1页
C#获取打印机状态+API函数详解_第2页
C#获取打印机状态+API函数详解_第3页
C#获取打印机状态+API函数详解_第4页
C#获取打印机状态+API函数详解_第5页
已阅读5页,还剩10页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、精品文档using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing;using System.Linq;using System.Text;using System.Windows.Forms;using System.Runtime.InteropServices;using System.Diagnostics;using System.Drawing.Printing;namespace testprinter2public

2、 partial class Form1 : Form #region 预定义类型FlagsAttributepublic enum PrinterEnumFlagsPRINTER_ENUM_DEFAULT = 0x00000001,PRINTER_ENUM_LOCAL = 0x00000002,PRINTER_ENUM_CONNECTIONS = 0x00000004, PRINTER_ENUM_FAVORITE = 0x00000004,PRINTER_ENUM_NAME = 0x00000008,PRINTER_ENUM_REMOTE = 0x00000010,PRINTER_ENUM_

3、SHARED = 0x00000020,PRINTER_ENUM_NETWORK = 0x00000040,PRINTER_ENUM_EXPAND = 0x00004000,PRINTER_ENUM_CONTAINER = 0x00008000,PRINTER_ENUM_ICONMASK = 0x00ff0000,PRINTER_ENUM_ICON1 = 0x00010000,PRINTER_ENUM_ICON2 = 0x00020000,PRINTER_ENUM_ICON3 = 0x00040000,PRINTER_ENUM_ICON4 = 0x00080000,PRINTER_ENUM_I

4、CON5 = 0x00100000,3 欢迎下载 。PRINTER_ENUM_ICON6 = 0x00200000,PRINTER_ENUM_ICON7 = 0x00400000,PRINTER_ENUM_ICON8 = 0x00800000,PRINTER_ENUM_HIDE = 0x01000000StructLayout(LayoutKind.Sequential) public struct PRINTER_INFO_2 MarshalAs(UnmanagedType.LPTStr) public string pServerName;MarshalAs(UnmanagedType.L

5、PTStr) public string pPrinterName;MarshalAs(UnmanagedType.LPTStr) public string pShareName;MarshalAs(UnmanagedType.LPTStr) public string pPortName;MarshalAs(UnmanagedType.LPTStr) public string pDriverName;MarshalAs(UnmanagedType.LPTStr) public string pComment;MarshalAs(UnmanagedType.LPTStr)public st

6、ring pLocation;public IntPtr pDevMode;MarshalAs(UnmanagedType.LPTStr)public string pSepFile;MarshalAs(UnmanagedType.LPTStr) public string pPrintProcessor;MarshalAs(UnmanagedType.LPTStr) public string pDatatype;MarshalAs(UnmanagedType.LPTStr)public string pParameters;public IntPtr pSecurityDescriptor

7、;public uint Attributes;public uint Priority;public uint DefaultPriority;public uint StartTime;public uint UntilTime;public uint Status;public uint cJobs;public uint AveragePPM;#endregion#region 引用 WindowsAPI/ 引用API声明DllImport("winspool.drv", CharSet = CharSet.Auto, SetLastError = true)ret

8、urn: MarshalAs(UnmanagedType.Bool) public static extern bool EnumPrinters(PrinterEnumFlags Flags, string Name, uint Level,IntPtr pPrinterEnum, uint cbBuf, ref uint pcbNeeded, ref uint pcReturned);#endregion/ <summary>/ 遍历打印机/ </summary>/ <param name="Flags"></param>

9、/ <returns></returns>DllImport("User32.dll")public static extern int MessageBox(int h, string m, string c, int type);public Form1() InitializeComponent();private void button1_Click(object sender, EventArgs e)PRINTER_INFO_2 Info2 = null;uint cbNeeded = 0;uint cReturned = 0;bool

10、ret = EnumPrinters(PrinterEnumFlags.PRINTER_ENUM_LOCAL, null, 2, IntPtr.Zero, 0, ref cbNeeded, ref cReturned);IntPtr pAddr = Marshal.AllocHGlobal(int)cbNeeded);ret = EnumPrinters(PrinterEnumFlags.PRINTER_ENUM_LOCAL, null, 2,精品文档pAddr, cbNeeded, ref cbNeeded, ref cReturned);if (ret)Info2 = new PRINTE

11、R_INFO_2cReturned;int offset = pAddr.ToInt32();for (int i = 0; i < cReturned; i+)Info2i = (PRINTER_INFO_2)Marshal.PtrToStructure(new IntPtr(offset), typeof(PRINTER_INFO_2);offset += Marshal.SizeOf(typeof(PRINTER_INFO_2);this.listBox1.Items.Add("打印机"+Info2i.pPrinterName + " 驱动为:&quo

12、t;+ Info2i.pDriverName);this.listBox1.Items.Add("");Marshal.FreeHGlobal(pAddr);/int a = MessageBox(0, Info20.pDriverName,"有",0);/end form/end namespace15欢迎下载EnumPrinters函数中文简介BOOL EnumPrinters(DWORD Flags, types of printer objects to enumerateLPTSTR Name, / name of printer object

13、DWORD Level, / specifies type of printer info structureLPBYTE pPrinterEnum, / pointer to buffer to receive printer info structuresDWORD cbBuf, / size, in bytes, of arrayLPDWORD pcbNeeded, / pointer to variable with no. of bytes copied (or required)LPDWORD pcReturned / pointer to variable with no. of

14、 printer info. structures copied );这个API用于了解可用的打印机的信息 参数的意义是:Flags:可以是 PRINTER_ENUM_LOCAL, PRINTER_ENUM_NAME, PRINTER_ENUM_SHARED,PRINTER_ENUM_DEFAULT,PRINTER_ENUM_CONNECTON霸某些合法的组合Name:与Flag相关的名字,例如,服务器名,域名等Level:您希望返回的结构类型,95可以用1,2, 5, NT 可以用1,2,4, 5分别代表PRINTER_INFO_1,PRINTER_INFO_2,PRINTER_INFO_4

15、,PRINTER_INFO_5各个结构而不同点是返回信息的详尽程度或者用途不同pPrinterEnum:您提供的一个接受返回结果的缓冲区cbBuf:这个缓冲区的大小(in Bytes)pcbNeeded:您提供的空间,API调用返回时,将告诉您用了 pPrinterEnum多少字节(成功时),或者需要多少字节(如果空间不够)pcReturned:您提供的空间,API调用返回时,将告诉您到底返回了多少个level中要求的结 构EnumPrinters返回非零值表示调用成功.EnumPrintersEnumPrintersVB声明Declare Function EnumPrinters Lib

16、"winspool.drv" Alias "EnumPrintersA" (ByVal flags As Long, ByVal name As String, ByVal Level As Long, pPrinterEnum As Byte, ByVal cdBuf As Long, pcbNeeded As Long, pcReturned As Long) As Long 说明 枚举系统中安装的打印机 返回值Long,非零表示成功,零表示失败。会设置 GetLastError 参数表 参数类型及说明flags Long , 一个或多个下述标志PR

17、INTER ENUM LOCAL举本地打印机(包括 Windows 95中的网络打印机)。名字会被忽略PRINTER_ENUM_NAME举由name参数指定的打印机。其中的名字可以是一个供应商、域或服务器。如name为NULL,则枚举出可用的打印机PRINTER_ENUM_SHARE举共享打印机(必须同其他常数组合使用)PRINTER_ENUM_CONNECTIONS网络连接列表中的打印机(即使目前没有连接一一仅适用于NT)PRINTER_ENUM_NETWORK通过网络连接的打印机。级别(Level )必须为1。仅适用于NTPRINTER_ENUM_REMOTEOH寸网络连接的打印机和打印服

18、务器。级别必须为1。仅适用于NTname String , vbNullString 表示枚举同本机连接的打印机。否则由标志和级别决定Level Long, 1, 2, 4或5 (4仅适用于NT; 5仅适用于 Win95和NT4.0 ),指定欲枚举的结构的类型。如果是 1,则name参数由标志设置决定。如果是 2或5,那么name就代表欲对 其打印机进行枚举的服务器的名字;或者为vbNullString 。如果是4,那么只有 PRINTER_ENUM_LOCALPRINTER_ENUM_CONNECTIONS效。名字必须是 vbNullString pPrinterEnum Byte ,包含

19、PRINTER_ENUM叁构的缓冲区,其中的 x代表级另(Level) cbBuf Long , pPrinterEnum 缓冲区中的字符数量pcbNeeded Long ,指向一个Long型变量的指针,该变量用于保存请求的缓冲区长度,或者 实际读入的字节数量pcReturned Long ,载入缓冲区的结构数量(用于那些能返回多个结构的函数) 注解第4和第5级将它们的结构建立在系统注册表的基础上,而且比第2级快得多。后者要求每台打印机都处于打开状态C鼾 Typeof是干什么的?2011-10-21 06:39 匿名|分类:编程t言|浏览5704次提问者采纳2011-10-21 07:25C#

20、 typeof()和 GetType()区是什么?1、typeof(x)中的x,必须是具体的类名、类型名称等,不可以是变量名称。2、GetType()方法继承自Object,所以C#任何对象都具有GetType()方法, 它的作用和typeof()相同,返回Type类型的当前对象的类型。比如有这样一个变量i:Int32 i = new Int32();i.GetType()返回值是Int32的类型,但是无法使用typeof(i),因为i是一个 变量,如果要使用typeof(),则只能:typeof(Int32),返回的同样是Int32的 类型。C#ft int和IntPtr 相互转换方法一、i

21、nt 转 IntPtrint i = 12;IntPtr p = new IntPtr(i);IntPtr 转 intint myi = (int)p;MessageBox.Show(myi.ToString();方法二、int 转 IntPtrint i = 12;IntPtr p =(IntPtr)iIntPtr 转 intint myi = (int)p;MessageBox.Show(myi.ToString();IntPtr 问题public aaa(IntPtr myPtr,int left, int top, int width, short height)myPtr转化成它内部

22、要使这里myPtr应该是对应到一块内存,你需要查看aaa函数是如何把 用的结构体的(一般都是结构体,也可能是其它对象,比如数组)。然后,你需要在你的托管代码中,定义该结构体,使用 StructLayout特性,对结构体的字 段使用MarshalAs特性,类似这样:StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi, Size = 13)public struct A101220OutputMarshalAs(UnmanagedType.ByValTStr, SizeConst = 11) public string Transa

23、ctionAccountID;MarshalAs(UnmanagedType.ByValTStr, SizeConst = 2)public string IsAuthenticated;然后在需要使用的地方,获取该结构体对象的IntPtr ,如下:/创建托管对象A101220Output output = new A101220Output ();output.TransactionAccountID = "11000000841”;output.IsAutienticated = "false"/分配非托管内存,并获取非托管内存地址起始位置指针int size

24、 = Marshal.SizeOf(output);IntPtr buffer = Marshal.AllocHGlobal(size);try/将托管对象拷贝到非托管内存Marshal.StructureToPtr(output, buffer, false);/调用非托管方法aaa.(buffer,0,0,640,480);finaly/释放非托管内存Marshal.FreeHGlobal(buffer);Free and Susan转C#中的IntPtr 类型本文转自:问:c#中无法将类型int ”隐式转换为System.IntPtr "这个是我引用了一个api函数时出现的问题

25、,我在声明中把intptr 换成了 int还是不可以,这是为什么呢?要如何处理呢?答:您好,C#中的IntPtr类型称为 平台特定的整数类型”,它们用于本机资源,如窗口句柄。资源的大小取决于使用的硬件和操作系统,但其大小总是足以包含系统的指针(因此也可以包含资源的名称)。所以,在您调用的API函数中一定有类似窗体句柄这样的参数,那么当您声明这个函数时,您应该将它显式地声明为IntPtr 类型。例如,在一个 C#S序中调用 Win32API mciSendString 函数控制光盘驱动器,这个函数的函数原 型是:MCIERROR mciSendString(LPCTSTR lpszCommand

26、,LPTSTR lpszReturnString, UINT cchReturn,HANDLE hwndCallback);首先在C#中声明这个函数:DllImport("winmm.dll")private static extern long mciSendString(string a,string b,uint c,IntPtr d);然后用这样的方法调用:mciSendString("set cdaudio door open", null, 0, this.Handle);您也可以使用IntPtr.Zero将句柄设置为 0;或者使用类型强制转

27、换:mciSendString("set cdaudio door open", null, 0, (IntPtr)0 );或者,使用IntPtr 构造函数:IntPtr a = new IntPtr(2121);这里有两点比较重要:一是在C#中声明 Win32API时,一定要按照 WinAPI的原型来声明,不要改变它的数据类型;二是尽量不要过多使用类型强制转换或构造函数的方式初始化一个IntPtr类型的变量,这样会使程序变得难于理解并容易出错Marshal.SizeOf 和 sizeof 的区别sizeof在非Unsafe环境下只能用于预定义的一系列类型,如Int , S

28、hort等等。而在Unsafe环境下,sizeof可以被用于值类型,但是值类型中不可以有引用类型,否则C译器会报错:error CS0208: Cannot take the address of, get the size of, or declare a pointer to a managed type ('SizeOf.Program.MyStruct')而Marshal.SizeOf 则是获得该类型被 Marshal (转换,通常翻译为列集,指数据从一种类 型转换到另外一种类型)到对应的非托管类型的大小。和 sizeof不同,Marshal.SizeOf 允 许用在含

29、有引用类型的值类型上:1: StructLayout(LayoutKind.Sequential)2: struct MyStruct3: 4: string s; 5:Marshal.SizeOf(MyStruct) 结果为 4 或者 8,因为 string 被 Marshal 成 char* 。如果用在不含有引用类型的值类型上,其结果也有可能和sizeof完全不一样,如对于下面的值类型:1: struct MyStruct2: 3: char b;4: sizeof(MyStruct) 为 2,而 Marshal.SizeOf(typeof(MyStruct) 结果则为 1。这是因为在.N

30、ET 中char总是Unicode ,而缺省情况下 char会被Marshal成8位的Ansi字符,因此结果不 同。反之,如果我们指定这个char被Marshal成short值(也就是UTF16),如下:1: StructLayout(LayoutKind.Sequential)2: struct MyStruct3: 4: MarshalAs(UnmanagedType.I2)5: char b;6: 那么 sizeof 和 Marshal.SizeOf结果均为2。MarshalAs 这个 Attribute 可以影响Marshal.SizeOf 的结果,而不能影响sizeof 的结果。一个有意思的情况是,如果值类型不含任何成员,如下:1: struct MyStruct2: 3: Sizeof和Marshal.SizeOf 结果均为1,而不是0。这个结果和 C+的结果是一致的。原因很简单:如果声明一个这样的数组,如果元素大小为0的话,那么每个元素都具有相同的地址,这是不为C+幅准所允许的,

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论