C#獲取打印機(jī)狀態(tài)+API函數(shù)詳解_第1頁
C#獲取打印機(jī)狀態(tài)+API函數(shù)詳解_第2頁
C#獲取打印機(jī)狀態(tài)+API函數(shù)詳解_第3頁
C#獲取打印機(jī)狀態(tài)+API函數(shù)詳解_第4頁
C#獲取打印機(jī)狀態(tài)+API函數(shù)詳解_第5頁
已閱讀5頁,還剩10頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

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 預(yù)定義類型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>/ 遍歷打印機(jī)/ </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("打印機(jī)"+Info2i.pPrinterName + " 驅(qū)動為:&quo

12、t;+ Info2i.pDriverName);this.listBox1.Items.Add("");Marshal.FreeHGlobal(pAddr);/int a = MessageBox(0, Info20.pDriverName,"有",0);/end form/end namespace15歡迎下載EnumPrinters函數(shù)中文簡介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 );這個(gè)API用于了解可用的打印機(jī)的信息 參數(shù)的意義是:Flags:可以是 PRINTER_ENUM_LOCAL, PRINTER_ENUM_NAME, PRINTER_ENUM_SHARED,PRINTER_ENUM_DEFAULT,PRINTER_ENUM_CONNECTON霸某些合法的組合Name:與Flag相關(guān)的名字,例如,服務(wù)器名,域名等Level:您希望返回的結(jié)構(gòu)類型,95可以用1,2, 5, NT 可以用1,2,4, 5分別代表PRINTER_INFO_1,PRINTER_INFO_2,PRINTER_INFO_4

15、,PRINTER_INFO_5各個(gè)結(jié)構(gòu)而不同點(diǎn)是返回信息的詳盡程度或者用途不同pPrinterEnum:您提供的一個(gè)接受返回結(jié)果的緩沖區(qū)cbBuf:這個(gè)緩沖區(qū)的大?。╥n Bytes)pcbNeeded:您提供的空間,API調(diào)用返回時(shí),將告訴您用了 pPrinterEnum多少字節(jié)(成功時(shí)),或者需要多少字節(jié)(如果空間不夠)pcReturned:您提供的空間,API調(diào)用返回時(shí),將告訴您到底返回了多少個(gè)level中要求的結(jié) 構(gòu)EnumPrinters返回非零值表示調(diào)用成功.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 說明 枚舉系統(tǒng)中安裝的打印機(jī) 返回值Long,非零表示成功,零表示失敗。會設(shè)置 GetLastError 參數(shù)表 參數(shù)類型及說明flags Long , 一個(gè)或多個(gè)下述標(biāo)志PR

17、INTER ENUM LOCAL舉本地打印機(jī)(包括 Windows 95中的網(wǎng)絡(luò)打印機(jī))。名字會被忽略PRINTER_ENUM_NAME舉由name參數(shù)指定的打印機(jī)。其中的名字可以是一個(gè)供應(yīng)商、域或服務(wù)器。如name為NULL,則枚舉出可用的打印機(jī)PRINTER_ENUM_SHARE舉共享打印機(jī)(必須同其他常數(shù)組合使用)PRINTER_ENUM_CONNECTIONS網(wǎng)絡(luò)連接列表中的打印機(jī)(即使目前沒有連接一一僅適用于NT)PRINTER_ENUM_NETWORK通過網(wǎng)絡(luò)連接的打印機(jī)。級別(Level )必須為1。僅適用于NTPRINTER_ENUM_REMOTEOH寸網(wǎng)絡(luò)連接的打印機(jī)和打印服

18、務(wù)器。級別必須為1。僅適用于NTname String , vbNullString 表示枚舉同本機(jī)連接的打印機(jī)。否則由標(biāo)志和級別決定Level Long, 1, 2, 4或5 (4僅適用于NT; 5僅適用于 Win95和NT4.0 ),指定欲枚舉的結(jié)構(gòu)的類型。如果是 1,則name參數(shù)由標(biāo)志設(shè)置決定。如果是 2或5,那么name就代表欲對 其打印機(jī)進(jìn)行枚舉的服務(wù)器的名字;或者為vbNullString 。如果是4,那么只有 PRINTER_ENUM_LOCALPRINTER_ENUM_CONNECTIONS效。名字必須是 vbNullString pPrinterEnum Byte ,包含

19、PRINTER_ENUM叁構(gòu)的緩沖區(qū),其中的 x代表級另(Level) cbBuf Long , pPrinterEnum 緩沖區(qū)中的字符數(shù)量pcbNeeded Long ,指向一個(gè)Long型變量的指針,該變量用于保存請求的緩沖區(qū)長度,或者 實(shí)際讀入的字節(jié)數(shù)量pcReturned Long ,載入緩沖區(qū)的結(jié)構(gòu)數(shù)量(用于那些能返回多個(gè)結(jié)構(gòu)的函數(shù)) 注解第4和第5級將它們的結(jié)構(gòu)建立在系統(tǒng)注冊表的基礎(chǔ)上,而且比第2級快得多。后者要求每臺打印機(jī)都處于打開狀態(tài)C鼾 Typeof是干什么的?2011-10-21 06:39 匿名|分類:編程t言|瀏覽5704次提問者采納2011-10-21 07:25C#

20、 typeof()和 GetType()區(qū)是什么?1、typeof(x)中的x,必須是具體的類名、類型名稱等,不可以是變量名稱。2、GetType()方法繼承自O(shè)bject,所以C#任何對象都具有GetType()方法, 它的作用和typeof()相同,返回Type類型的當(dāng)前對象的類型。比如有這樣一個(gè)變量i:Int32 i = new Int32();i.GetType()返回值是Int32的類型,但是無法使用typeof(i),因?yàn)閕是一個(gè) 變量,如果要使用typeof(),則只能:typeof(Int32),返回的同樣是Int32的 類型。C#ft int和IntPtr 相互轉(zhuǎn)換方法一、i

21、nt 轉(zhuǎn) IntPtrint i = 12;IntPtr p = new IntPtr(i);IntPtr 轉(zhuǎn) intint myi = (int)p;MessageBox.Show(myi.ToString();方法二、int 轉(zhuǎn) IntPtrint i = 12;IntPtr p =(IntPtr)iIntPtr 轉(zhuǎn) intint myi = (int)p;MessageBox.Show(myi.ToString();IntPtr 問題public aaa(IntPtr myPtr,int left, int top, int width, short height)myPtr轉(zhuǎn)化成它內(nèi)部

22、要使這里myPtr應(yīng)該是對應(yīng)到一塊內(nèi)存,你需要查看aaa函數(shù)是如何把 用的結(jié)構(gòu)體的(一般都是結(jié)構(gòu)體,也可能是其它對象,比如數(shù)組)。然后,你需要在你的托管代碼中,定義該結(jié)構(gòu)體,使用 StructLayout特性,對結(jié)構(gòu)體的字 段使用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;然后在需要使用的地方,獲取該結(jié)構(gòu)體對象的IntPtr ,如下:/創(chuàng)建托管對象A101220Output output = new A101220Output ();output.TransactionAccountID = "11000000841”;output.IsAutienticated = "false"/分配非托管內(nèi)存,并獲取非托管內(nèi)存地址起始位置指針int size

24、 = Marshal.SizeOf(output);IntPtr buffer = Marshal.AllocHGlobal(size);try/將托管對象拷貝到非托管內(nèi)存Marshal.StructureToPtr(output, buffer, false);/調(diào)用非托管方法aaa.(buffer,0,0,640,480);finaly/釋放非托管內(nèi)存Marshal.FreeHGlobal(buffer);Free and Susan轉(zhuǎn)C#中的IntPtr 類型本文轉(zhuǎn)自:問:c#中無法將類型int ”隱式轉(zhuǎn)換為System.IntPtr "這個(gè)是我引用了一個(gè)api函數(shù)時(shí)出現(xiàn)的問題

25、,我在聲明中把intptr 換成了 int還是不可以,這是為什么呢?要如何處理呢?答:您好,C#中的IntPtr類型稱為 平臺特定的整數(shù)類型”,它們用于本機(jī)資源,如窗口句柄。資源的大小取決于使用的硬件和操作系統(tǒng),但其大小總是足以包含系統(tǒng)的指針(因此也可以包含資源的名稱)。所以,在您調(diào)用的API函數(shù)中一定有類似窗體句柄這樣的參數(shù),那么當(dāng)您聲明這個(gè)函數(shù)時(shí),您應(yīng)該將它顯式地聲明為IntPtr 類型。例如,在一個(gè) C#S序中調(diào)用 Win32API mciSendString 函數(shù)控制光盤驅(qū)動器,這個(gè)函數(shù)的函數(shù)原 型是:MCIERROR mciSendString(LPCTSTR lpszCommand

26、,LPTSTR lpszReturnString, UINT cchReturn,HANDLE hwndCallback);首先在C#中聲明這個(gè)函數(shù):DllImport("winmm.dll")private static extern long mciSendString(string a,string b,uint c,IntPtr d);然后用這樣的方法調(diào)用:mciSendString("set cdaudio door open", null, 0, this.Handle);您也可以使用IntPtr.Zero將句柄設(shè)置為 0;或者使用類型強(qiáng)制轉(zhuǎn)

27、換:mciSendString("set cdaudio door open", null, 0, (IntPtr)0 );或者,使用IntPtr 構(gòu)造函數(shù):IntPtr a = new IntPtr(2121);這里有兩點(diǎn)比較重要:一是在C#中聲明 Win32API時(shí),一定要按照 WinAPI的原型來聲明,不要改變它的數(shù)據(jù)類型;二是盡量不要過多使用類型強(qiáng)制轉(zhuǎn)換或構(gòu)造函數(shù)的方式初始化一個(gè)IntPtr類型的變量,這樣會使程序變得難于理解并容易出錯(cuò)Marshal.SizeOf 和 sizeof 的區(qū)別sizeof在非Unsafe環(huán)境下只能用于預(yù)定義的一系列類型,如Int , S

28、hort等等。而在Unsafe環(huán)境下,sizeof可以被用于值類型,但是值類型中不可以有引用類型,否則C譯器會報(bào)錯(cuò):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 (轉(zhuǎn)換,通常翻譯為列集,指數(shù)據(jù)從一種類 型轉(zhuǎn)換到另外一種類型)到對應(yīng)的非托管類型的大小。和 sizeof不同,Marshal.SizeOf 允 許用在含

29、有引用類型的值類型上:1: StructLayout(LayoutKind.Sequential)2: struct MyStruct3: 4: string s; 5:Marshal.SizeOf(MyStruct) 結(jié)果為 4 或者 8,因?yàn)?string 被 Marshal 成 char* 。如果用在不含有引用類型的值類型上,其結(jié)果也有可能和sizeof完全不一樣,如對于下面的值類型:1: struct MyStruct2: 3: char b;4: sizeof(MyStruct) 為 2,而 Marshal.SizeOf(typeof(MyStruct) 結(jié)果則為 1。這是因?yàn)樵?N

30、ET 中char總是Unicode ,而缺省情況下 char會被Marshal成8位的Ansi字符,因此結(jié)果不 同。反之,如果我們指定這個(gè)char被Marshal成short值(也就是UTF16),如下:1: StructLayout(LayoutKind.Sequential)2: struct MyStruct3: 4: MarshalAs(UnmanagedType.I2)5: char b;6: 那么 sizeof 和 Marshal.SizeOf結(jié)果均為2。MarshalAs 這個(gè) Attribute 可以影響Marshal.SizeOf 的結(jié)果,而不能影響sizeof 的結(jié)果。一個(gè)有意思的情況是,如果值類型不含任何成員,如下:1: struct MyStruct2: 3: Sizeof和Marshal.SizeOf 結(jié)果均為1,而不是0。這個(gè)結(jié)果和 C+的結(jié)果是一致的。原因很簡單:如果聲明一個(gè)這樣的數(shù)組,如果元素大小為0的話,那么每個(gè)元素都具有相同的地址,這是不為C+幅準(zhǔn)所允許的,

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論