经理原话“你帮我用C#调用windows打印功能。实现一个对打印机控制的程序,实现功能是 1去取打印机状态 2去取打印机的队列. 3暂停。因为手头没有真的打印机。所以就下在了个虚拟的打印机。
下载了许多C#的源代码。大多都是有“预览” “打印”功能的。打印的时候,在XP的“开始”—》“设置”——》“打印机和传真” 然后进入当前打印的那个打印机。发现队列里有文档。也有暂停和打印机状态。我现在的疑问是,难道经理让我做的程序就是取这里面的一些数据么?请问高手帮忙分析下,我理解的是否正确?这样的程序可行么?
或者是,我把问题想复杂了,下载的那些程序已经可以满足经理的要求了!
从来就没接触过打印机这方面东西,希望懂的朋友能帮忙分析下!有时间的话尽量说细点,拜托了!!万分感激!!!!
下载了许多C#的源代码。大多都是有“预览” “打印”功能的。打印的时候,在XP的“开始”—》“设置”——》“打印机和传真” 然后进入当前打印的那个打印机。发现队列里有文档。也有暂停和打印机状态。我现在的疑问是,难道经理让我做的程序就是取这里面的一些数据么?请问高手帮忙分析下,我理解的是否正确?这样的程序可行么?
或者是,我把问题想复杂了,下载的那些程序已经可以满足经理的要求了!
从来就没接触过打印机这方面东西,希望懂的朋友能帮忙分析下!有时间的话尽量说细点,拜托了!!万分感激!!!!
要获得打印机的状态,应该定义一个联合.enum PrinterStatus
{
其他状态= 1,
未知,
空闲,
正在打印,
预热,
停止打印,
打印中,
离线
}其中的"正在打印"和"打印中"是同一个意思,至于为什么会是这样,目前还不知道.在程序中添加System.Management的引用:using System.Management;然后编写获取打印机状态的函数如下:/// <summary>
/// 获取打印机的当前状态
/// </summary>
/// <param name="PrinterDevice">打印机设备名称</param>
/// <returns>打印机状态</returns>
private PrinterStatus GetPrinterStat(string PrinterDevice)
{
PrinterStatus ret=0;
string path=@"win32_printer.DeviceId='"+PrinterDevice+"'";
ManagementObject printer=new ManagementObject(path);
printer.Get();
ret=(PrinterStatus)Convert.ToInt32(printer.Properties["PrinterStatus"].Value);
return ret;
}调用示例:MessageBox.Show(GetPrinterStat("\\\\192.168.0.88\\Samsung SCX-4x16 Series").ToString());Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=352678补充:System.Windows.Forms.MessageBox.Show(printer.Properties["WorkOffline"].Value.ToString());可以获取打印机是否离线.
Private Const CCHDEVICENAME = 32
Private Const CCHFORMNAME = 32
Private Type DEVMODE
dmDeviceName As String * CCHDEVICENAME
dmSpecVersion As Integer
dmDriverVersion As Integer
dmSize As Integer
dmDriverExtra As Integer
dmFields As Long
dmOrientation As Integer
dmPaperSize As Integer
dmPaperLength As Integer
dmPaperWidth As Integer
dmScale As Integer
dmCopies As Integer
dmDefaultSource As Integer
dmPrintQuality As Integer
dmColor As Integer
dmDuplex As Integer
dmYResolution As Integer
dmTTOption As Integer
dmCollate As Integer
dmFormName As String * CCHFORMNAME
dmUnusedPadding As Integer
dmBitsPerPel As Integer
dmPelsWidth As Long
dmPelsHeight As Long
dmDisplayFlags As Long
dmDisplayFrequency As Long
End Type
Private Type PRINTER_INFO_2
pServerName As String
pPrinterName As String
pShareName As String
pPortName As String
pDriverName As String
pComment As String
pLocation As String
pDevMode As Long
pSepFile As String
pPrintProcessor As String
pDatatype As String
pParameters As String
pSecurityDescriptor As Long
Attributes As Long
Priority As Long
DefaultPriority As Long
StartTime As Long
UntilTime As Long
Status As Long
JobsCount As Long
AveragePPM As Long
End Type
Private Type PRINTER_DEFAULTS
pDatatype As String
pDevMode As DEVMODE
DesiredAccess As Long
End Type
Public Enum Printer_Status
PRINTER_STATUS_READY = &H0
PRINTER_STATUS_PAUSED = &H1
PRINTER_STATUS_ERROR = &H2
PRINTER_STATUS_PENDING_DELETION = &H4
PRINTER_STATUS_PAPER_JAM = &H8
PRINTER_STATUS_PAPER_OUT = &H10
PRINTER_STATUS_MANUAL_FEED = &H20
PRINTER_STATUS_PAPER_PROBLEM = &H40
PRINTER_STATUS_OFFLINE = &H80
PRINTER_STATUS_IO_ACTIVE = &H100
PRINTER_STATUS_BUSY = &H200
PRINTER_STATUS_PRINTING = &H400
PRINTER_STATUS_OUTPUT_BIN_FULL = &H800
PRINTER_STATUS_NOT_AVAILABLE = &H1000
PRINTER_STATUS_WAITING = &H2000
PRINTER_STATUS_PROCESSING = &H4000
PRINTER_STATUS_INITIALIZING = &H8000
PRINTER_STATUS_WARMING_UP = &H10000
PRINTER_STATUS_TONER_LOW = &H20000
PRINTER_STATUS_NO_TONER = &H40000
PRINTER_STATUS_PAGE_PUNT = &H80000
PRINTER_STATUS_USER_INTERVENTION = &H100000
PRINTER_STATUS_OUT_OF_MEMORY = &H200000
PRINTER_STATUS_DOOR_OPEN = &H400000
PRINTER_STATUS_SERVER_UNKNOWN = &H800000
PRINTER_STATUS_POWER_SAVE = &H1000000
End Enum
Private Declare Function OpenPrinter Lib "winspool.drv" Alias "OpenPrinterA" (ByVal pPrinterName As String, phPrinter As Long, pDefault As PRINTER_DEFAULTS) As Long
Private Declare Function GetPrinter Lib "winspool.drv" Alias "GetPrinterA" (ByVal hPrinter As Long, ByVal Level As Long, buffer As Long, ByVal pbSize As Long, pbSizeNeeded As Long) As Long
Private Declare Function ClosePrinter Lib "winspool.drv" (ByVal hPrinter As Long) As Long
Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long)
Private Declare Function IsBadStringPtrByLong Lib "kernel32" Alias "IsBadStringPtrA" (ByVal lpsz As Long, ByVal ucchMax As Long) As Long
Public Function StringFromPointer(lpString As Long, lMaxLength As Long) As String
Dim sRet As String
Dim lret As Long
If lpString = 0 Then
StringFromPointer = ""
Exit Function
End If
If IsBadStringPtrByLong(lpString, lMaxLength) Then
' An error has occured - do not attempt to use this pointer
StringFromPointer = ""
Exit Function
End If
' Pre-initialise the return string...
sRet = Space$(lMaxLength)
CopyMemory ByVal sRet, ByVal lpString, ByVal Len(sRet)
If Err.LastDllError = 0 Then
If InStr(sRet, Chr$(0)) > 0 Then
sRet = Left$(sRet, InStr(sRet, Chr$(0)) - 1)
End If
End If
StringFromPointer = sRet
End Function
Private Sub Form_Load()
Dim SizeNeeded As Long, buffer() As Long
Dim pDef As PRINTER_DEFAULTS
'Get a handle to the printer
lret = OpenPrinter(Printer.DeviceName, mhPrinter, pDef)
'Initialize the buffer
ReDim Preserve buffer(0 To 0) As Long
'Retrieve the required size (in bytes)
lret = GetPrinter(mhPrinter, 2, buffer(0), UBound(buffer), SizeNeeded)
'Resize the buffer... Note that a Long is four bytes
ReDim Preserve buffer(0 To (SizeNeeded / 4) + 3) As Long
'Retrieve the Printer information
lret = GetPrinter(mhPrinter, 2, buffer(0), UBound(buffer) * 4, SizeNeeded)
'The data stored in 'buffer' corresponds with the data of a PRINTER_INFO_2 structure
ClosePrinter mhPrinter
'Show the data
PrintData "Server name", StringFromPointer(buffer(0), 255)
PrintData "Printer name", StringFromPointer(buffer(1), 255)
PrintData "Share name", StringFromPointer(buffer(2), 255)
PrintData "Port name", StringFromPointer(buffer(3), 255)
PrintData "Driver name", StringFromPointer(buffer(4), 255)
PrintData "Comment", StringFromPointer(buffer(5), 255)
PrintData "Location", StringFromPointer(buffer(6), 255)
Unload Me
End Sub
Sub PrintData(Name As String, Data As String)
If LenB(Data) > 0 Then
Debug.Print Name + ": " + Data
End If
End Sub
[return: MarshalAs(UnmanagedType.Bool)]
private static extern bool EnumPrinters ([MarshalAs(UnmanagedType.U4)] PRINTER_ENUM flags,
[MarshalAs(UnmanagedType.LPStr)] string sName,
uint iLevel,
IntPtr pPrinterDesc,
uint iSize,
[MarshalAs(UnmanagedType.U4)] ref uint iNeeded,
[MarshalAs(UnmanagedType.U4)] ref uint iReturned
);
打印机设置