DOBON.NET DOBON.NETプログラミング掲示板過去ログ

DEVMODE構造体

環境/言語:[XP]
分類:[.NET]

VB.NETからDEVMODE構造体にアクセスして、プリンタ情報を取得したり設定変更したりする方法を教えて下さい。
宜しくお願いします。
こんにちは中です。

> VB.NETからDEVMODE構造体にアクセスして、プリンタ情報を取得したり設定変更したりする方法を教えて下さい。
> 宜しくお願いします。

DEVMODE構造体にアクセスしたところでプリンタ情報を取得は出来ませんよ?
ま、私自身かなりあきらめ気分で途中放棄しているのでがんばってください。

http://pinvoke.net/
2005/04/28(Thu) 07:25:31 編集(投稿者)

具体的にはプリンターのどのような情報を取得したいのでしょうか?
印刷余白の設定・取得等ならできますが(やっておりますが)
DEVMODE構造体 自体は取得した事はないのですが、GetDeviceCaps API関数を
使って、VB6.0 と同様にプリンターの設定をしております。

問題はプリンターのDCハンドルが取得できないという事では?
Windows標準のプリンタ設定にプリンタメーカが独自で拡張しているDEVMODE構造体にアクセスして、180°回転とフェースアップダウンの排紙先を切替えたいのですが
.....
■No10643に返信(たかさんの記事)
> Windows標準のプリンタ設定にプリンタメーカが独自で拡張しているDEVMODE構造体にアクセスして、180°回転とフェースアップダウンの排紙先を切替えたいのですが
> .....

それで、どの部分が解らないのでしょうか?
VB6.0 では、実行されていたのでしょうか?
■No10645に返信(花ちゃんさんの記事)
> ■No10643に返信(たかさんの記事)
>>Windows標準のプリンタ設定にプリンタメーカが独自で拡張しているDEVMODE構造体にアクセスして、180°回転とフェースアップダウンの排紙先を切替えたいのですが
>>.....
>
> それで、どの部分が解らないのでしょうか?
> VB6.0 では、実行されていたのでしょうか?
>

VB5.0では、動作確認できてますが、DEVMODEを直接操作せず、Printerオブジェクト
とResetDCを使用して設定しました。
VB.NETの場合は、PrintDocumentクラスのpd.printの直前で設定を変更したいのですが、DEVMODEを操作しないといけないといわれて四苦八苦している状態です。
DocumentPropertiesAPIとかSetHdevModeとかを使用すればいいのか?
色々な方法があるような感じで、どの方法がいいのか?
さっぱりわかりません。
■No10648に返信(たかさんの記事)
> ■No10645に返信(花ちゃんさんの記事)
>>■No10643に返信(たかさんの記事)
> >>Windows標準のプリンタ設定にプリンタメーカが独自で拡張しているDEVMODE構造体にアクセスして、180°回転とフェースアップダウンの排紙先を切替えたいのですが
> >>.....
>>
>>それで、どの部分が解らないのでしょうか?
>>VB6.0 では、実行されていたのでしょうか?
>>
>
> VB5.0では、動作確認できてますが、DEVMODEを直接操作せず、Printerオブジェクト
> とResetDCを使用して設定しました。
その方法を移行できないのですか?

> VB.NETの場合は、PrintDocumentクラスのpd.printの直前で設定を変更したいのですが、DEVMODEを操作しないといけないといわれて四苦八苦している状態です。
どなたにお聞きになったのですか? その方に聞くのが一番かと思いますが。

> DocumentPropertiesAPIとかSetHdevModeとかを使用すればいいのか?
VB5.0 でDEVMODEを操作して取得する方法から試してみたらどうですか?
> さっぱりわかりません。
私も貴方がどこのメーカのプリンターを使用されてどのようなOSを使用して
どのような環境(ネットワークプリンターとか)で使用されていて
メーカ独自で拡張しているDEVMODE構造体 とやらが何か解りません。
本当にさっぱり解らないならいっその事あきらめられたらどうですか?
(基本的にはその辺の操作はVB6.0のコードを.NET用に書き直すしかないので
VB6.0のコードで取得できるのかどうかも解らないなら)
>>VB5.0では、動作確認できてますが、DEVMODEを直接操作せず、Printerオブジェクト
>>とResetDCを使用して設定しました。

とありますが、VB5.0では、DevMode構造体のプライベート領域にアクセスできるのですか?

.netでは、GetHdevmodeとSetHdevmode でDevMode構造体の取得&設定はできますが
プライベート領域にアクセスすることは難しいと思います。
仮にアクセスできたとしても、そのプライベート領域は、ドライバ固有のフォーマットです。
そのフォーマットは公開されているものなのでしょうか?

たぶん無理だと思いますが、下記のページも参考にしてみてください。

http://www.interq.or.jp/www-user/wanderer/program/memo/recture/printer-3.html#about_DEVMODE
仮にDEVMODE構造体にアクセスできたとしての話ですが、
・dmPaperSize
・dmPaperLength
・dmPaperWidth
などといったパラメータがいっぱいあります。
とりあえず、WindowsSDKのヘルプを見てみる事をお勧めします。
  • 題名: Re[6]: DEVMODE構造体
  • 著者: たか
  • 日時: 2005/04/28 14:20:35
  • ID: 10654
  • この記事の返信元:
  • この記事への返信:
    • (なし)
  • ツリーを表示
■No10650に返信(ポンさんの記事)
> >>VB5.0では、動作確認できてますが、DEVMODEを直接操作せず、Printerオブジェクト
> >>とResetDCを使用して設定しました。
>
> とありますが、VB5.0では、DevMode構造体のプライベート領域にアクセスできるのですか?

VB5とVB6で可能です。
>
> .netでは、GetHdevmodeとSetHdevmode でDevMode構造体の取得&設定はできますが
> プライベート領域にアクセスすることは難しいと思います。
GetHdevmodeとSetHdevmodeの使い方が知りたいのです。

> 仮にアクセスできたとしても、そのプライベート領域は、ドライバ固有のフォーマットです。
> そのフォーマットは公開されているものなのでしょうか?
>
> たぶん無理だと思いますが、下記のページも参考にしてみてください。
>
> http://www.interq.or.jp/www-user/wanderer/program/memo/recture/printer-3.html#about_DEVMODE

メーカから拡張ドライバを頂いておりますが、公開ではございません。
そこで、グローバル領域のDEVMODE構造体のアクセス方法を知りたいのです。
参考資料がほしいのです。
Imports System.Runtime.InteropServices
Imports System.ComponentModel
Imports System.ComponentModel.Design.Serialization
Imports System.Reflection

'DEVMODE
<StructLayout(LayoutKind.Sequential)> _
Private Structure DEVMODE
<MarshalAsAttribute(UnmanagedType.LPTStr, SizeConst:=32)> Public dmDeviceName As String
Public dmSpecVersion As Short
Public dmDriverVersion As Short
Public dmSize As Short
Public dmDriverExtra As Short
Public dmFields As Integer
Public dmOrientation As Short
Public dmPaperSize As Short
Public dmPaperLength As Short
Public dmPaperWidth As Short
Public dmScale As Short
Public dmCopies As Short
Public dmDefaultSource As Short
Public dmPrintQuality As Short
Public dmColor As Short
Public dmDuplex As Short
Public dmYResolution As Short
Public dmTTOption As Short
Public dmCollate As Short
<MarshalAsAttribute(UnmanagedType.LPTStr, SizeConst:=32)> Public dmFormName As String
Public dmUnusedPadding As Short
Public dmBitsPerPel As Short
Public dmPelsWidth As Integer
Public dmPelsHeight As Integer
Public dmDisplayFlags As Integer
Public dmDisplayFrequency As Integer
End Structure


Dim pd As New System.Drawing.Printing.PrintDocument
Dim PtrDevMode As IntPtr
Dim GlobalDevMode As IntPtr
Dim pDevMode As DEVMODE

PtrDevMode = pd.PrinterSettings.GetHdevmode(pd.PrinterSettings.DefaultPageSettings)
globalDevMode = Marshal.AllocHGlobal(PtrDevMode)
pDevMode = CType(Marshal.PtrToStructure(PtrDevMode, GetType(DEVMODE)), DEVMODE)
'DevMode の設定を変更
With pDevMode
'.dmPaperSize =
'.dmOrientation =
End With

Marshal.StructureToPtr(pDevMode, globalDevMode, True)
pd.PrinterSettings.SetHdevmode(globalDevMode)
Marshal.FreeHGlobal(globalDevMode)



こんな感じでできるはずなんですけど、DEVMODE構造体の宣言がおかしい為か
pDevMode をみると正しく入っていないみたいです。
確か前にできていたはずなんですが...
無責任なコードで申し訳ないです、
私のほうも、あとで調べてみます。
> こんな感じでできるはずなんですけど、DEVMODE構造体の宣言がおかしい為か

下記で取得できます。

<StructLayout(LayoutKind.Sequential)> Public Structure DEVMODE
<MarshalAsAttribute(UnmanagedType.ByValTStr, SizeConst:=32)> Public dmDeviceName As String
Public dmSpecVersion As Short
Public dmDriverVersion As Short
Public dmSize As Short
Public dmDriverExtra As Short
Public dmFields As Integer
Public dmOrientation As Short
Public dmPaperSize As Short
Public dmPaperLength As Short
Public dmPaperWidth As Short
Public dmScale As Short
Public dmCopies As Short
Public dmDefaultSource As Short
Public dmPrintQuality As Short
Public dmColor As Short
Public dmDuplex As Short
Public dmYResolution As Short
Public dmTTOption As Short
Public dmCollate As Short
<MarshalAsAttribute(UnmanagedType.ByValTStr, SizeConst:=32)> Public dmFormName As String
Public dmUnusedPadding As Short
Public dmBitsPerPel As Short
Public dmPelsWidth As Integer
Public dmPelsHeight As Integer
Public dmDisplayFlags As Integer
Public dmDisplayFrequency As Integer
End Structure
>確か前にできていたはずなんですが...

今確認したところ、前にできたというのは、Win32APIでの話でした。
試しにWin32APIで取得したDevModeを、.netの PrintDocumentクラスに
SetHdevmodeで設定しても、うまく動きませんでした。(私の力量不足だけなのかもしれませんが)

花ちゃんさんへ、
上記コードで、そのDevMode構造体を差し替えてみましたが、
pDevMode をクイックウオッチでみると正しく入っていないみたいです。
  • 題名: Re[10]: DEVMODE構造体
  • 著者: たか
  • 日時: 2005/04/28 20:33:01
  • ID: 10664
  • この記事の返信元:
  • この記事への返信:
    • (なし)
  • ツリーを表示
■No10660に返信(ポンさんの記事)
> >確か前にできていたはずなんですが...
>
> 今確認したところ、前にできたというのは、Win32APIでの話でした。
> 試しにWin32APIで取得したDevModeを、.netの PrintDocumentクラスに
> SetHdevmodeで設定しても、うまく動きませんでした。(私の力量不足だけなのかもしれませんが)
>
> 花ちゃんさんへ、
> 上記コードで、そのDevMode構造体を差し替えてみましたが、
> pDevMode をクイックウオッチでみると正しく入っていないみたいです。
>
>
ポンさん、花ちゃんさんありがとうございます。
動作しなくても大まかな処理の流れがわかり助かります。
こちらでもいろいろと試して見ます。
取り急ぎお礼まで
■No10660に返信(ポンさんの記事)
> >確か前にできていたはずなんですが...
>
> 今確認したところ、前にできたというのは、Win32APIでの話でした。
> 試しにWin32APIで取得したDevModeを、.netの PrintDocumentクラスに
> SetHdevmodeで設定しても、うまく動きませんでした。(私の力量不足だけなのかもしれませんが)
>
> 花ちゃんさんへ、
> 上記コードで、そのDevMode構造体を差し替えてみましたが、
> pDevMode をクイックウオッチでみると正しく入っていないみたいです。
>
>
pDevMode をクイックウオッチでみるとデータは入っているのですが、
正しいかどうかはわかりません。
SetHdevmodeは、DEVMODEWしか認識されないらしいです。
DEVMODEWは、NT/2000/XPのAPIでのみ対応のUnicode版DEVMODEらしいです。

とりあえずDEVMODEのプライベート部分へのアクセスと設定変更はできるように
なりました。
ありがとうございました。
解決済み!

> とりあえずDEVMODEのプライベート部分へのアクセスと設定変更はできるように
> なりました。

せっかくですので、取得できたコードを投稿して頂いたらいかがでしょうか?
(協力して頂いた方々や考えてくださった方にに報いるためにも)
  • 題名: Re[12]: DEVMODE構造体
  • 著者: たか
  • 日時: 2005/04/29 16:00:37
  • ID: 10673
  • この記事の返信元:
  • この記事への返信:
    • (なし)
  • ツリーを表示
■No10672に返信(花ちゃんさんの記事)
>
>>とりあえずDEVMODEのプライベート部分へのアクセスと設定変更はできるように
>>なりました。
>
> せっかくですので、取得できたコードを投稿して頂いたらいかがでしょうか?
> (協力して頂いた方々や考えてくださった方にに報いるためにも)の
>
メーカ独自の拡張ドライバですのでメーカの許可なく公開できません。
誠に申し訳ありません。

DOBON.NET | プログラミング道 | プログラミング掲示板