2011/03/25(Fri) 16:08:18 編集(投稿者)
PrintDlgExで確認中で、
とりあえず、32bitOS上でPrintDlgExが動作するところまで
いきましたが、64bitOS上ではどうにもうまくいきません。
以下のようにやっていますが、hResult に 80070057 が
返ってきます。エラー値を調べたのですが引数エラーの
ようです。
◆構造体メンバの型がおかしいのでしょうか?
◆それと、ググったサイトでPrintDlgExの宣言で
[In(), Out()]と括弧付きで宣言しているのを見つけたのですが
[In, Out]とどちらがあっているのでしょうか?
※そもそも違いがわかりませんorz
◆EXのほうは「PD_PRINTSETUP」がフラグにないのですね。。。
ボタンを「印刷」→「OK」にしたいところですが、、、
とりあえずはx64で動作させたいところです。
//プリンタダイアログEX
[DllImport("comdlg32.dll", CharSet = CharSet.Auto)]
private static extern int PrintDlgEx([In, Out] PRINTDLGEX lppd);
//Flags
private const Int32 PD_NOSELECTION = 0x4;
private const Int32 PD_NOPAGENUMS = 0x8;
private const Int32 PD_PRINTSETUP = 0x40;
private const Int32 PD_RETURNDC = 0x100;
private const Int32 PD_HIDEPRINTTOFILE = 0x100000;
private const Int32 PD_NONETWORKBUTTON = 0x200000;
private const Int32 PD_NOCURRENTPAGE = 0x800000;
//戻り値
private const int PD_RESULT_CANCEL = 0;
private const int PD_RESULT_PRINT = 1;
private const int PD_RESULT_APPLY = 2;
//PRINTDLGEX CLASS
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto, Pack = 1)]
[ComVisible(false)]
private class PRINTDLGEX
{
public Int32 lStructSize;
public IntPtr hwndOwner;
public IntPtr hDevMode;
public IntPtr hDevNames;
public IntPtr hDC = IntPtr.Zero;
public Int32 Flags = PD_RETURNDC;
public Int32 Flags2 = 0;
public Int32 ExclusionFlags = 0;
public Int32 nPageRanges = 0;
public Int32 nMaxPageRanges = 0;
public IntPtr lpPageRanges = IntPtr.Zero;
public Int32 nMinPage = 0;
public Int32 nMaxPage = 0;
public Int32 Copies = 1;
public IntPtr hInstance = IntPtr.Zero;
public IntPtr lpPrintTemplateName;
public IntPtr lpCallback = IntPtr.Zero;
public Int32 nPropertyPages = 0;
public IntPtr lphPropertyPages = IntPtr.Zero;
public Int32 nStartPage = -1;
public Int32 dwResultAction = 0;
}
void test()
{
PrintDocument pd = new PrintDocument(); //<--実際はデフォルトプリンタではないです
IntPtr hDevMode = pd.PrinterSettings.GetHdevmode();
IntPtr hDevNames = pd.PrinterSettings.GetHdevnames();
PRINTDLGEX pdlg = new PRINTDLGEX();
pdlg.lStructSize = Marshal.SizeOf(pdlg);
pdlg.hwndOwner = owner.Handle;
pdlg.hDevMode = hDevMode;
pdlg.hDevNames = hDevNames;
pdlg.Flags = PD_HIDEPRINTTOFILE | PD_NOSELECTION | PD_NOCURRENTPAGE | PD_NOPAGENUMS | PD_RETURNDC;
int hResult = PrintDlgEx(pdlg);
if ((hResult != 0) || (pdlg.dwResultAction == PD_RESULT_CANCEL))
{
return DialogResult.Cancel;
}
}