ネタ元:クリスタルレポートの用紙種類の列挙体の取得
多分将来的に必要になると思うので勉強も含め作ってみました。
一応動作確認はしてますが必要であろう処理がいくつか抜けていると思うので注意してください。
Imports System
Imports System.Runtime.InteropServices
Module Module1
'用紙名のリストを取得するため
Declare Function DeviceCapabilitiesNames Lib "winspool.drv" Alias "DeviceCapabilitiesA" ( _
ByVal pDevice As String, _
ByVal pPort As String, _
ByVal fwCapability As Short, _
ByVal pOutput As String, _
ByVal pDevMode As IntPtr) As Integer
'用紙番号のリストを取得するため
Declare Function DeviceCapabilitiesPapers Lib "winspool.drv" Alias "DeviceCapabilitiesA" ( _
ByVal pDevice As String, _
ByVal pPort As String, _
ByVal fwCapability As Short, _
ByVal pOutput() As Short, _
ByVal pDevMode As IntPtr) As Integer
Const DC_PAPERS As Integer = 2
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 = "A4"
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, Nothing, 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 hEncoding As System.Text.Encoding = System.Text.Encoding.GetEncoding("Shift-JIS")
Dim paper As String = hEncoding.GetString(hEncoding.GetBytes(PaperNames), i * 64, 64)
If paper.Trim().CompareTo(PaperName) = 0 Then
paperIndex = i
Exit For
End If
Next
Dim paperNumberCount As Integer
'用紙サイズ番号のリストの数を取得
paperNumberCount = DeviceCapabilitiesPapers(PrinterName, PortName, DC_PAPERS, Nothing, 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
ああかなりメンドクセ。
用紙サイズ名(A4など)を元に用紙サイズ番号を取得するには、先に用紙サイズ名リストを取得しなければなりません。
そっちで該当の用紙サイズ名があれば、用紙サイズ番号リストを取得し、用紙サイズ名リスト側でのインデックス位置と同じ場所にある用紙サイズ番号リストのインデックス位置の用紙サイズ番号が該当する用紙サイズ番号となります。(なんか説明しててわかりにくいw)
このへんもちっと簡単に取得できたらいいんですけどねー。
MSDNをちらっと見たけど見つかんなかったです。