ネットワークプリンタのIPアドレスをとりたいのだが...
とりあえずポート名は以下の処理で取れる(一部、Dobonさんのページ http://dobon.net/vb/dotnet/graphics/printerport.html にあるサンプルソースを転用)。
Private Sub GetPrinters_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles GetPrinters.Click
Dim printer As New PrinterSettings
For Each printerObj As String In printer.InstalledPrinters
printerList.Items.Add(printerObj.ToString)
Next
End Sub
Private Sub printerList_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles printerList.SelectedIndexChanged
Dim printerInfo As PRINTER_INFO_2
printerInfo = GetPrinterInfo(printerList.SelectedItem)
PortNameLabel.Text = printerInfo.pPortName
DriverNameLabel.Text = printerInfo.pDriverName
End Sub
Public Shared Function GetPrinterInfo(ByVal printerName As String) As PRINTER_INFO_2
'プリンタのハンドルを取得する
Dim hPrinter As IntPtr
If Not OpenPrinter(printerName, hPrinter, IntPtr.Zero) Then
Throw New Win32Exception(Marshal.GetLastWin32Error())
End If
Dim pPrinterInfo As IntPtr = IntPtr.Zero
Try
'必要なバイト数を取得する
Dim needed As Integer
GetPrinter(hPrinter, 2, IntPtr.Zero, 0, needed)
If needed <= 0 Then
Throw New Exception("失敗しました。")
End If
'メモリを割り当てる
pPrinterInfo = Marshal.AllocHGlobal(needed)
'プリンタ情報を取得する
Dim temp As Integer
If Not GetPrinter(hPrinter, 2, pPrinterInfo, needed, temp) Then
Throw New Win32Exception(Marshal.GetLastWin32Error())
End If
'PRINTER_INFO_2型にマーシャリングする
Dim printerInfo As PRINTER_INFO_2 = _
CType(Marshal.PtrToStructure( _
pPrinterInfo, GetType(PRINTER_INFO_2)), PRINTER_INFO_2)
'結果を返す
Return printerInfo
Finally
'後始末をする
ClosePrinter(hPrinter)
Marshal.FreeHGlobal(pPrinterInfo)
End Try
End Function
これでポート名を取り、それを元にレジストリを検索すると、
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Print\Printers
に上記コードにあるPRINTER_INFO_2の内容が置いてあるのを発見。でもIPアドレスは無い。
さらに検索をすすめると、以下のキーに、ポートのIPアドレスが記載されているのを発見。
HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Control\Print\Monitors\Standard TCP/IP Port\Ports
これにアクセスするAPIを探せば良いのね。