プリンタのプロパティだけを表示

やったことメモ(´ω`)


PringDialog表示するとプリンタ名の横にプロパティボタンがあります。
プロパティボタンを押下するとプリンタ毎のプロパティが表示されますが、PringDialogを経由せずに直接このプロパティ画面を呼び出す方法のテスト。

とりあえずソース(・∀・)

[DllImport("winspool.drv",SetLastError=true)] 
static extern bool OpenPrinter(string pPrinterName, out IntPtr phPrinter, IntPtr pDefault);
[DllImport("winspool.drv", SetLastError=true)]
static extern int ClosePrinter(IntPtr hPrinter);  
[DllImport("winspool.drv", EntryPoint="DocumentPropertiesW", SetLastError=true, ExactSpelling=true, CallingConvention=CallingConvention.StdCall)]
static extern int DocumentProperties(IntPtr hwnd, IntPtr hPrinter, [MarshalAs(UnmanagedType.LPWStr)] string pDeviceName, IntPtr pDevModeOutput, IntPtr pDevModeInput, int fMode);
public static bool ShowProperties(IntPtr hwnd, PrinterSettings ps)
{
    IntPtr hPrt = IntPtr.Zero;

    IntPtr hDevMode = ps.GetHdevmode( ps.DefaultPageSettings );
    IntPtr pDevModeInput = Marshal.AllocHGlobal( hDevMode );

    if ( OpenPrinter( ps.PrinterName, out hPrt, IntPtr.Zero ) == false )
    {
        return( false );
    }
    if ( hPrt == IntPtr.Zero )
    {
        return( false );
    }

    int size = DocumentProperties( hwnd, hPrt, ps.PrinterName, IntPtr.Zero, IntPtr.Zero, 0 );

    IntPtr pDevModeOutput = Marshal.AllocHGlobal( size );

    int ret = DocumentProperties( hwnd, hPrt, ps.PrinterName, pDevModeOutput, pDevModeInput, 14 );
    if ( ret == 1 )
    {
        ps.SetHdevmode( pDevModeOutput );
    }

    Marshal.FreeHGlobal( pDevModeOutput );
    Marshal.FreeHGlobal( pDevModeInput );
    ClosePrinter( hPrt );

    return( true );
}
// 使いかた
PrinterSettings ps = new PrinterSettings();
ps.PrinterName = "FX DocuCentre Color 400";
ShowProperties( Handle, ps ); // Handleは親画面のウインドウハンドル

これで良いのかな?*1
DocumentProperties()の14っていう引数はDM_OUT_BUFFER|DM_IN_PROMPT|DM_IN_BUFFERのことで、DocumentPropertiesW()なところに注意っと。


呼び出し側でPrinterSettingsのデフォルトを用意してShowProperties()を呼び出すと、PrinterSettingsの内容について、プロパティ画面で更新した内容が返ってきますだよ(´ω`)


ちなみにシステムの標準設定は更新されないのね(´Д`)
レジストリにDEVMODEのバイナリ値らしきものがありますけど。


だから使い回したいときは、自分で値を保持しておく必要があるっと。
Officeなんかはファイル毎に埋め込んでる?(´ω`)

*1:エラー処理とか適当…