通常使うプリンタをプログラムから変更するには?


中山  2004-07-07 16:26:21  No: 114600  IP: [192.*.*.*]

利用可能なプリンタをリストボックスに表示して、そのうちのひとつを
選択して「変更」ボタンをクリックすると、通常使うプリンタが
選択したプリンタになる画面を作成しているのですが、
うまく動作しません。

リストボックスに利用可能なプリンタを表示することは出来たのですが
変更が出来ません。

他のページ等でサンプルがあったので使用してみたのですが、
どうしても通常使うプリンタの変更が出来ません。

よい方法がある方は教えてください。

ちなみに、環境は下記の通りです。
Windows2000とWindowsXP
VB6(SP5)

編集 削除
nanashi  2004-07-07 17:05:23  No: 114601  IP: [192.*.*.*]

APIのSetDefaultPrinterで出来ませんか?

編集 削除
はむはむ  2004-07-07 17:17:43  No: 114602  IP: [192.*.*.*]

SetDefaultPrinter では、一部出来ないようなことを聞いたことがあります。
下の方法を使用すれば大丈夫だと思います。

Option Explicit
Private Declare Function GetVersion Lib "kernel32.dll" () As Long
Private Declare Function WriteProfileString Lib "kernel32.dll" Alias _
"WriteProfileStringA" (ByVal lpszSection As String, _
ByVal lpszKeyName As String, ByVal lpszString As String) As Long
Private Declare Function SendMessage Lib "user32.dll" Alias "SendMessageA" _
(ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
Private Const HWND_BROADCAST  As Long = &HFFFF&
Private Const WM_WININICHANGE As Long = &H1A&
Private Function isWindowsNT() As Boolean
  isWindowsNT = IIf(GetVersion() And &H80000000, False, True)
End Function
Private Sub SetWindowsDefaultPrinter( _
    ByVal DeviceName As String, ByVal DriverName As String, ByVal Port As String)
  Dim param As String
  param = DeviceName & "," & DriverName & "," & Port
  WriteProfileString "windows", "device", param
  If isWindowsNT Then
    'Windows NT/2000
    SendMessage HWND_BROADCAST, WM_WININICHANGE, 0&, ByVal 0&
  Else
    'Windows 95/98/Me
    SendMessage HWND_BROADCAST, WM_WININICHANGE, 0&, ByVal "windows"
  End If
  Printer.EndDoc
End Sub
Private Sub Form_Load()
  Dim tp As Printer
  For Each tp In Printers
    If tp.DeviceName = "変更したいプリンタ" Then
      SetWindowsDefaultPrinter tp.DeviceName, tp.DriverName, tp.Port
      Exit For
    End If
  Next tp
End Sub

編集 削除
はむはむ  2004-07-07 17:20:42  No: 114603  IP: [192.*.*.*]

# 私の書き込みから
# 当ページを最初に表示させた時
# エンコードが“西ヨーロッパ言語”
# になるようになってしまいました。

みなさんも最初、そうなって、
文字化けしていませんか?

編集 削除
中山  2004-07-07 18:14:52  No: 114604  IP: [192.*.*.*]

回答の方、有難うございます。
実際に実行してみたのですが、変更が更新されるまでにかなり時間が
かかっています。(SendMessageが実行される時に時間がかかっています。)

変更する時に時間がかからない方法はありませんか?

よろしくお願いします。

編集 削除
えれも  2004-07-09 21:53:12  No: 114605  IP: [192.*.*.*]

WSH使うとか?

Dim objWsh As Object
                
Set objWsh = CreateObject("WScript.Network")
objWsh.SetDefaultPrinter デバイス名

Set objWsh = Nothing

編集 削除