C#获取打印机状态+API函数详解.docx
- 文档编号:28533800
- 上传时间:2023-07-18
- 格式:DOCX
- 页数:11
- 大小:18.56KB
C#获取打印机状态+API函数详解.docx
《C#获取打印机状态+API函数详解.docx》由会员分享,可在线阅读,更多相关《C#获取打印机状态+API函数详解.docx(11页珍藏版)》请在冰豆网上搜索。
C#获取打印机状态+API函数详解
usingSystem;
using;
using;
using;
using;
using;
using;
usingtestprinter2
{
publicpartialclassForm1:
Form
{
#region预定义类型
[FlagsAttribute]
publicenumPrinterEnumFlags
{
PRINTER_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_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_ICON5=0x00100000,
PRINTER_ENUM_ICON6=0x00200000,
PRINTER_ENUM_ICON7=0x00400000,
PRINTER_ENUM_ICON8=0x00800000,
PRINTER_ENUM_HIDE=0x01000000
}
[StructLayout]
publicstructPRINTER_INFO_2
{
[MarshalAs]
publicstringpServerName;
[MarshalAs]
publicstringpPrinterName;
[MarshalAs]
publicstringpShareName;
[MarshalAs]
publicstringpPortName;
[MarshalAs]
publicstringpDriverName;
[MarshalAs]
publicstringpComment;
[MarshalAs]
publicstringpLocation;
publicIntPtrpDevMode;
[MarshalAs]
publicstringpSepFile;
[MarshalAs]
publicstringpPrintProcessor;
[MarshalAs]
publicstringpDatatype;
[MarshalAs]
publicstringpParameters;
publicIntPtrpSecurityDescriptor;
publicuintAttributes;
publicuintPriority;
publicuintDefaultPriority;
publicuintStartTime;
publicuintUntilTime;
publicuintStatus;
publicuintcJobs;
publicuintAveragePPM;
}
#endregion
#region引用WindowsAPI
PrinterName+"驱动为:
"+Info2[i].pDriverName);
"");
}
(pAddr);
}
DriverName,"有",0);
}
}ofbytescopied(orrequired)
LPDWORDpcReturnedofprinterinfo.structurescopied
);
这个API用于了解可用的打印机的信息
参数的意义是:
Flags:
可以是PRINTER_ENUM_LOCAL,PRINTER_ENUM_NAME,PRINTER_ENUM_SHARED,PRINTER_ENUM_DEFAULT,
PRINTER_ENUM_CONNECTIONS等或者某些合法的组合
Name:
与Flag相关的名字,例如,服务器名,域名等
Level:
您希望返回的结构类型,95可以用1,2,5,NT可以用1,2,4,5
分别代表
PRINTER_INFO_1,
PRINTER_INFO_2,
PRINTER_INFO_4,
PRINTER_INFO_5
各个结构的不同点是返回信息的详尽程度或者用途不同
pPrinterEnum:
您提供的一个接受返回结果的缓冲区
cbBuf:
这个缓冲区的大小(inBytes)
pcbNeeded:
您提供的空间,API调用返回时,将告诉您用了pPrinterEnum多少字节(成功时),或者需要多少字节(如果空间不够)
pcReturned:
您提供的空间,API调用返回时,将告诉您到底返回了多少个level中要求的结构
EnumPrinters返回非零值表示调用成功.
EnumPrinters
EnumPrinters
VB声明
DeclareFunctionEnumPrintersLib""Alias"EnumPrintersA"(ByValflagsAsLong,ByValnameAsString,ByValLevelAsLong,pPrinterEnumAsByte,ByValcdBufAsLong,pcbNeededAsLong,pcReturnedAsLong)AsLong
说明
枚举系统中安装的打印机
返回值
Long,非零表示成功,零表示失败。
会设置GetLastError
参数表
参数类型及说明
flagsLong,一个或多个下述标志
PRINTER_ENUM_LOCAL枚举本地打印机(包括Windows95中的网络打印机)。
名字会被忽略
PRINTER_ENUM_NAME枚举由name参数指定的打印机。
其中的名字可以是一个供应商、域或服务器。
如name为NULL,则枚举出可用的打印机
PRINTER_ENUM_SHARE枚举共享打印机(必须同其他常数组合使用)
PRINTER_ENUM_CONNECTIONS枚举网络连接列表中的打印机(即使目前没有连接——仅适用于NT)
PRINTER_ENUM_NETWORK枚举通过网络连接的打印机。
级别(Level)必须为1。
仅适用于NT
PRINTER_ENUM_REMOTE枚举通过网络连接的打印机和打印服务器。
级别必须为1。
仅适用于NT
nameString,vbNullString表示枚举同本机连接的打印机。
否则由标志和级别决定
LevelLong,1,2,4或5(4仅适用于NT;5仅适用于Win95和NT),指定欲枚举的结构的类型。
如果是1,则name参数由标志设置决定。
如果是2或5,那么name就代表欲对其打印机进行枚举的服务器的名字;或者为vbNullString。
如果是4,那么只有PRINTER_ENUM_LOCAL和PRINTER_ENUM_CONNECTIONS才有效。
名字必须是vbNullString
pPrinterEnumByte,包含PRINTER_ENUM_x结构的缓冲区,其中的x代表级别(Level)
cbBufLong,pPrinterEnum缓冲区中的字符数量
pcbNeededLong,指向一个Long型变量的指针,该变量用于保存请求的缓冲区长度,或者实际读入的字节数量
pcReturnedLong,载入缓冲区的结构数量(用于那些能返回多个结构的函数)
注解
第4和第5级将它们的结构建立在系统注册表的基础上,而且比第2级快得多。
后者要求每台打印机都处于打开状态
C#中Typeof是干什么的
2011-10-2106:
39匿名|分类:
编程语言|浏览5704次
提问者采纳
2011-10-2107:
25
C#typeof()和GetType()区是什么?
1、typeof(x)中的x,必须是具体的类名、类型名称等,不可以是变量名称。
2、GetType()方法继承自Object,所以C#中任何对象都具有GetType()方法,它的作用和typeof()相同,返回Type类型的当前对象的类型。
比如有这样一个变量i:
Int32i=newInt32();
()返回值是Int32的类型,但是无法使用typeof(i),因为i是一个变量,如果要使用typeof(),则只能:
typeof(Int32),返回的同样是Int32的类型。
C#中int和IntPtr相互转换
方法一、
int转IntPtr
inti=12;
IntPtrp=newIntPtr(i);
IntPtr转int
intmyi=(int)p;
());
方法二、
int转IntPtr
inti=12;
IntPtrp=(IntPtr)i
IntPtr转int
intmyi=(int)p;
());
IntPtr问题
publicaaa(IntPtrmyPtr,intleft,inttop,intwidth,shortheight)
这里myPtr应该是对应到一块内存,你需要查看aaa函数是如何把myPtr转化成它内部要使用的结构体的(一般都是结构体,也可能是其它对象,比如数组)。
然后,你需要在你的托管代码中,定义该结构体,使用StructLayout特性,对结构体的字段使用MarshalAs特性,类似这样:
[StructLayout,CharSet=,Size=13)]
publicstructA101220Output
{
[MarshalAs,SizeConst=11)]
publicstringTransactionAccountID;
[MarshalAs,SizeConst=2)]
publicstringIsAuthenticated;
}
然后在需要使用的地方,获取该结构体对象的IntPtr,如下:
buffer,0,0,640,480);
}
finaly
{
ET中char总是Unicode,而缺省情况下char会被Marshal成8位的Ansi字符,因此结果不同。
反之,如果我们指定这个char被Marshal成short值(也就是UTF16),如下:
1:
[StructLayout]
2:
structMyStruct
3:
{
4:
[MarshalAs]
5:
charb;
6:
}
那么sizeof和结果均为2。
MarshalAs这个Attribute可以影响的结果,而不能影响sizeof的结果。
一个有意思的情况是,如果值类型不含任何成员,如下:
1:
structMyStruct
2:
{
3:
}
Sizeof和结果均为1,而不是0。
这个结果和C++的结果是一致的。
原因很简单:
如果声明一个这样的数组,如果元素大小为0的话,那么每个元素都具有相同的地址,这是不为C++标准所允许的,和正常的非0的情况也不一致。
.NET在这里采用和c++相同的规则,也认为空的值类型大小为1。
最后需要注意的是,如果MyStruct是模板:
1:
structMyStruct
2:
{
3:
Ta;
4:
}
如果对传入MyStruct<>或者MyStruct
这个是历史遗留问题,从本质上来讲实例化的模板类型(MyStruct
同样的,sizeof也不支持模板类型,而且连MyStruct
C#编译器会对sizeof(MyStruct
errorCS0208:
Cannottaketheaddressof,getthesizeof,ordeclareapointertoamanagedtype('')
#region和#endregion是什么
2012-11-1016:
30:
57|分类:
默认分类|标签:
|字号大中小订阅
用来注释中间代码的作用而且在其他地方用到中间的类和方法都会有你标注的注释本身不参与编译还可以缩进代码方便阅览
折叠代码
#region使您得以在使用VisualStudio代码编辑器的大纲显示功能时指定可展开或折叠的代码块。
#regionname
其中:
name
希望给予将出现在VisualStudio代码编辑器中的区域的名称。
备注
必须用#endregion指令终止#region块。
#region块不能与#if块重叠。
但是,可以将#region块嵌套在#if块内,并且可以将#if块嵌套在#region块内。
示例
//
#regionMyClassdefinition
publicclassMyClass
{
publicstaticvoidMain()
{
}
}
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- C# 获取 打印机 状态 API 函数 详解