[VB.NET]プリンタの用紙サイズの番号の取得
前回のコメントでUnicode版という宿題をいただいたので作ってみました。
なかなか倒せませんでしたが(^^;
DeviceCapabilitiesW関数でpOutputへの値をUnicodeで取得するために、DllImportAttribute属性を使うようにしました。
基本は前回と同じ動作となってます。
Imports System
Imports System.Text
Imports System.Runtime.InteropServices
Module Module1
<DllImport("WINSPOOL.DRV", CharSet:=CharSet.Unicode, EntryPoint:="DeviceCapabilitiesW")> _
Private Function DeviceCapabilitiesNames(ByVal pDevice As String, _
ByVal pPort As String, _
ByVal fwCapability As Integer, _
ByVal pOutput As String, _
ByVal pDevMode As IntPtr) As Integer
End Function
<DllImport("WINSPOOL.DRV", CharSet:=CharSet.Unicode, EntryPoint:="DeviceCapabilitiesW")> _
Private Function DeviceCapabilitiesPapers(ByVal pDevice As String, _
ByVal pPort As String, _
ByVal fwCapability As Integer, _
ByVal pOutput As Short(), _
ByVal pDevMode As IntPtr) As Integer
End Function
Private Const DC_PAPERS As Integer = 2
Private Const DC_PAPERNAMES As Integer = 16
Sub Main()
Dim PrinterName As String = "EPSON PM-G720 (M)"
Dim PortName As String = "USB001"
Dim paperName As String = "A3"
Dim no As Short = GetPaperNumber(PrinterName, PortName, paperName)
Console.WriteLine("プリンタ {0} の用紙 {1} の番号は {2} です。", PrinterName, paperName, no)
Console.ReadKey()
End Sub
Private Function GetPaperNumber(ByVal PrinterName As String, ByVal PortName As String, ByVal PaperName As String) As Short
Dim PaperNamesCount As Integer
'用紙名のリストの数を取得
PaperNamesCount = DeviceCapabilitiesNames(PrinterName, PortName, DC_PAPERNAMES, CType(Nothing, String), IntPtr.Zero)
Dim PaperNames As String = New String(" "c, PaperNamesCount * 64)
Call DeviceCapabilitiesNames(PrinterName, PortName, DC_PAPERNAMES, PaperNames, IntPtr.Zero)
Dim paperIndex As Integer = 0
For i As Integer = 0 To PaperNamesCount - 1
Dim paper As String = PaperNames.Substring(i * 64, 64)
paper = paper.Substring(0, paper.IndexOf(Nothing))
If paper.Trim().CompareTo(PaperName) = 0 Then
paperIndex = i
Exit For
End If
Next
Dim paperNumberCount As Integer
'用紙サイズ番号のリストの数を取得
paperNumberCount = DeviceCapabilitiesPapers(PrinterName, PortName, DC_PAPERS, CType(Nothing, Short()), IntPtr.Zero)
Dim paperNumbers As Short()
ReDim paperNumbers(paperNumberCount - 1)
Call DeviceCapabilitiesPapers(PrinterName, PortName, DC_PAPERS, paperNumbers, IntPtr.Zero)
Return paperNumbers(paperIndex)
End Function
End Module