質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Visual Studio 2013

Microsoft Visual Studio 2013は、Microsoftによる統合開発環境(IDE)であり、多種多様なプログラミング言語に対応しています。 Visual Studio 2012の次のバージョンです

VB.NET

Microsoft Visual Basic .NETのことで、Microsoft Visual Basic(VB6)の後継。 .NET環境向けのプログラムを開発することができます。 現在のVB.NETでは、.NET Frameworkを利用して開発を行うことが可能です。

Q&A

解決済

1回答

3539閲覧

DEVMODEを使った印刷情報の取得について

aqaxliy

総合スコア13

Visual Studio 2013

Microsoft Visual Studio 2013は、Microsoftによる統合開発環境(IDE)であり、多種多様なプログラミング言語に対応しています。 Visual Studio 2012の次のバージョンです

VB.NET

Microsoft Visual Basic .NETのことで、Microsoft Visual Basic(VB6)の後継。 .NET環境向けのプログラムを開発することができます。 現在のVB.NETでは、.NET Frameworkを利用して開発を行うことが可能です。

0グッド

0クリップ

投稿2018/11/07 03:20

編集2018/11/07 05:00

前提・実現したいこと

VB.NETでプリンタに直接印刷指示を行うプログラムを作っています。
DEVMODE構造体を利用すれば、細かい設定を出来ることが出来そうなので、
まずは現在のデフォルトプリンタの設定を呼び出すプログラムを作成したいです。

しかし、ハンドルなどを利用した事が今までないので、
どうすれば良いか殆どわからない状態で作ったコードが下記のコードになります。

該当のソースコード

vb

1<StructLayout(LayoutKind.Sequential)> _ 2Public Structure DEVMODE 3 Public Const CCHDEVICENAME As Integer = 32 4 Public Const CCHFORMNAME As Integer = 32 5 6 <MarshalAs(UnmanagedType.ByValTStr, SizeConst:=CCHDEVICENAME)> _ 7 Public dmDeviceName As String 8 Public dmSpecVersion As Short 9 Public dmDriverVersion As Short 10 Public dmSize As Short 11 Public dmDriverExtra As Short 12 Public dmFields As Integer 13 14 Public dmOrientation As Short 15 Public dmPaperSize As Short 16 Public dmPaperLength As Short 17 Public dmPaperWidth As Short 18 19 Public dmScale As Short 20 Public dmCopies As Short 21 Public dmDefaultSource As Short 22 Public dmPrintQuality As Short 23 Public dmColor As Short 24 Public dmDuplex As Short 25 Public dmYResolution As Short 26 Public dmTTOption As Short 27 Public dmCollate As Short 28 <MarshalAs(UnmanagedType.ByValTStr, SizeConst:=CCHFORMNAME)> _ 29 Public dmFormName As String 30 Public dmLogPixels As Short 31 Public dmBitsPerPel As Integer 32 Public dmPelsWidth As Integer 33 Public dmPelsHeight As Integer 34 Public dmDisplayFlags As Integer 35 Public dmDisplayFrequency As Integer 36 37 Public dmICMMethod As Integer 38 Public dmICMIntent As Integer 39 Public dmMediaType As Integer 40 Public dmDitherType As Integer 41 Public dmReserved1 As Integer 42 Public dmReserved2 As Integer 43 Public dmPanningWidth As Integer 44 Public dmPanningHeight As Integer 45 46 Public dmPositionX As Integer 47 Public dmPositionY As Integer 48End Structure 49 50Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click 51 PrintDocument1.PrinterSettings.PrinterName = "Microsoft Print to PDF" 52 Dim devmodePtr As IntPtr = PrintDocument1.PrinterSettings.GetHdevmode() 53 Dim dm As DEVMODE = CType(Marshal.PtrToStructure(devmodePtr, GetType(DEVMODE)), DEVMODE) 54 GlobalFree(devmodePtr) 55End Sub

発生している問題・エラーメッセージ

上記のコードを確認すると、
dm.dmDeviceNameが「K」になっていたり、
dm.dmPaperSizeが「101」になっていたり、
上手く取得できません。

補足情報(FW/ツールのバージョンなど)

VB.NET 4.5

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

自己解決

一行目を下記のように変更すると正しく取得できるようになりました。

vb

1<StructLayout(LayoutKind.Sequential)> _

vb

1<StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Auto)> _

投稿2018/11/07 04:43

編集2018/11/07 05:07
aqaxliy

総合スコア13

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問