tagCANDY CGI VBレスキュー(花ちゃん) の Visual Basic 2010 用 掲示板(VB.NET 掲示板) [ツリー表示へ]   [Home]
一括表示(VB.NET VB2005)
タイトルプリンタ情報について
記事No4874
投稿日: 2007/01/22(Mon) 18:01
投稿者てつ
初めて投稿します。

APIのDeviceCapabilitiesを使い
プリンタの情報を取得したいと考えています。

用紙サイズ番号は取得できるのですが
用紙サイズ名が取得できません。

どなたか取得方法を知っていましたら教えてください。


    Public Const DC_PAPERS = 2
    Public Const DC_BINS = 6
    Public Const DC_BINNAMES = 12
    Public Const DC_PAPERNAMES = 16

    Declare Function DeviceCapabilities Lib "winspool.drv" Alias "DeviceCapabilitiesA" ( _
    ByVal pDevice As String, _
    ByVal pPort As String, _
    ByVal fwCapability As Short, _
    <System.Runtime.InteropServices.OutAttribute()> ByVal pOutput() As Short, _
    ByVal pDevMode As IntPtr) As Integer

    Declare Function DeviceCapabilitiesName Lib "winspool.drv" Alias "DeviceCapabilitiesA" ( _
    ByVal pDevice As String, _
    ByVal pPort As String, _
    ByVal fwCapability As Short, _
    <System.Runtime.InteropServices.OutAttribute()> ByVal pOutput() As String, _
    ByVal pDevMode As IntPtr) As Integer

    ' ある位置から別の位置にメモリブロックを移動する関数の宣言
    Public Declare Sub MoveMemory Lib "kernel32.dll" Alias "RtlMoveMemory" _
    (ByVal Destination As String, _
    <System.Runtime.InteropServices.OutAttribute()> ByVal Source As Byte, _
    ByVal Length As Long)



    Public Function GetPaperIndex(ByVal strPrinterName As String, ByVal strPaperName As String) As Integer


        Dim lngIdx As Long
        Dim lngBinsCount As Long
        Dim strBuf() As String
        Dim x As String
        Dim intBins() As Short
        Dim strBinName As String
        Dim lngInitPos As Long
        Dim strRowSource As String


        strRowSource = ""
        lngInitPos = -1
        lngBinsCount = DeviceCapabilities(strPrinterName, Nothing, _
        DC_PAPERS, Nothing, _
        System.IntPtr.Zero)

        Try

        If lngBinsCount >= 1 Then
            ReDim intBins(lngBinsCount - 1)
            ReDim strBuf(lngBinsCount - 1)
      '用紙サイズ番号取得
            Call DeviceCapabilities(strPrinterName, Nothing, _
            DC_PAPERS, intBins, _
            System.IntPtr.Zero)
      '用紙サイズ名取得    エラーになる
            Call DeviceCapabilities(strPrinterName, Nothing, _
            DC_PAPERNAMES , intBins, _
            System.IntPtr.Zero)

            For lngIdx = 0 To lngBinsCount - 1
        '用紙サイズ番号が取れているか確認
                MsgBox(intBins(lngIdx))
            Next lngIdx
            End If

        Catch ex As Exception
            MsgBox(ex.Message)

        End Try

    End Function

[ツリー表示へ]
タイトルRe: プリンタ情報について
記事No4876
投稿日: 2007/01/22(Mon) 20:22
投稿者花ちゃん
VB2005 を使いましょう  って言うか質問する時は環境位書くようにしましょう、特に
周辺機器に関する場合は周辺機器等も含め

http://hanatyan.sakura.ne.jp/samplepic/vb8_134.htm


WIN 32 API を使った方法は、以前回答した分が、あったのですが....。

[ツリー表示へ]
タイトルRe^2: プリンタ情報について
記事No4878
投稿日: 2007/01/22(Mon) 21:07
投稿者てつ
返信ありがとうございます。

> VB2005 を使いましょう  って言うか質問する時は環境位書くようにしましょう、特に
> 周辺機器に関する場合は周辺機器等も含め

説明不足ですみません。
.NET  Visual Basic 2003
      Crystal Report XI
で開発を行っております。

> WIN 32 API を使った方法は、以前回答した分が、あったのですが....。

早速、サンプルコード「134」を拝見しました。
このやり方だと「通常使うプリンタ」に関してののサイズ名だけしか
取得できないのではないのでしょうか?

サンプルコード「135」を拝見しましたところ
プリンタに関する情報をすべて「WIN 32 API」を使い
取得しているらしくこの方法を参考にしたいのです。

お手数ですがご教授下さい。

[ツリー表示へ]
タイトルありがとうございます。
記事No4880
投稿日: 2007/01/23(Tue) 10:41
投稿者てつ

印刷したい用紙サイズの用紙サイズIDを取得したい考えていたのですが
そのためには用紙サイズ名と比較して用紙サイズIDを取得しようと考えていました。

やり方をかえて用紙サイズ(横、縦の長さ)で用紙サイズIDを取得するように
しましたところうまくいきました。

大変、お世話になりました。

[ツリー表示へ]