Jak ustawić drukowanie dwustronne dla klientów Automatyzacji programu Microsoft Word

Tłumaczenia artykułów Tłumaczenia artykułów
Numer ID artykułu: 828638 - Zobacz jakich produktów dotyczą zawarte w tym artykule porady.
Rozwiń wszystko | Zwiń wszystko

Na tej stronie

Streszczenie

Klienci Automatyzacji programu Microsoft Word nie mogą ustawić flagi drukowania dwustronnego (dupleksu) przed rozpoczęciem zadania drukowania w programie Microsoft Office Word 2003. Chociaż jeden z parametrów w metodzie PrintOut wskazuje, że drukowanie dwustronne jest obsługiwane, nie zapewnia on prawdziwego drukowania dwustronnego. Ponadto ten parametr może być niedostępny — zależy to od systemu operacyjnego lub zainstalowanego języka. W celu obejścia tego ograniczenia w systemach Microsoft Windows trzeba zmienić flagę dupleksu dla aktywnej drukarki przed wywołaniem funkcji PrintOut w programie Word.

W tym artykule opisano, jak użyć interfejsu Microsoft Windows API do zmiany ustawienia dupleksu drukarki aktywnej w celu umożliwienia dwustronnego wydrukowania dokumentu programu Word.

Więcej informacji

Dodawanie lokalnego sterownika drukarki dla drukarki sieciowej w systemie Microsoft Windows 2000

Sterownik drukarki nie znajduje się na komputerze lokalnym. Znajduje się on na serwerze wydruku. Dla użytkowników systemu Microsoft Windows 2000, którzy muszą drukować na udostępnionej drukarce sieciowej, może to stanowić problem. Chociaż administrator zabezpieczeń może tak skonfigurować serwer wydruku, aby użytkownicy końcowi mogli zmieniać ustawienia globalne, firma Microsoft zazwyczaj tego nie zaleca. Aby obejść ten problem, można zainstalować lokalny sterownik drukarki dla drukarki sieciowej, a następnie pozwolić poszczególnym użytkownikom na kontrolowanie ustawień ich systemów lokalnych. Aby to zrobić, wykonaj następujące kroki:
  1. Kliknij przycisk Start, kliknij polecenie Ustawienia, kliknij polecenie Drukarki, a następnie kliknij dwukrotnie ikonę Dodaj drukarkę.

    Zostaje uruchomiony Kreator dodawania drukarki.

    Kliknij przycisk Dalej.
  2. Kliknij opcję Drukarka lokalna, a następnie kliknij przycisk Dalej.
  3. Kliknij opcję Utwórz nowy port, a następnie kliknij pozycję Local Port w sekcji Typ.
  4. W polu Nazwa portu wpisz lokalizację drukarki w sieci.

    Wpisz na przykład \\serwer_wydruku\nazwa_drukarki.

    Uwaga: Użyj dokładnej ścieżki i nazwy drukarki.
  5. Kliknij przycisk Dalej, a następnie wybierz sterownik drukarki przeznaczony dla systemu Windows 2000.
  6. Kliknij przycisk Dalej, a następnie postępuj zgodnie z instrukcjami, aby ukończyć pracę kreatora.

Tworzenie przykładu

Zmiana właściwości drukarki dla drukarki aktywnej wpływa na wszystkie aplikacje korzystające z drukarki aktywnej, a nie tylko na program Word. Jeśli trzeba zmienić ustawienia dla określonego zadania drukowania, po jego zakończeniu należy przywrócić ustawienia oryginalne.

W poniższym kodzie używana jest funkcja API DocumentProperties do zamiany ustawień drukowania sterownika drukarki, tak aby włączyć drukowanie dwustronne. Aby ten kod działał poprawnie, użytkownik końcowy musi mieć odpowiednie uprawnienia do zmiany globalnych ustawień drukowania dla drukarki. Jeśli użytkownik końcowy nie ma odpowiednich uprawnień do zmiany ustawień sterownika, po wywołaniu funkcji API OpenPrinter odbiera komunikat o błędzie „Odmowa dostępu”.
  1. Uruchom program Microsoft Visual Basic 6.0. Utwórz nowy projekt.

    Domyślnie tworzony jest formularz Form1.
  2. Dodaj do projektu standardowy moduł .bas. Dodaj następujący kod w oknie kodu tego modułu:
    Option Explicit
    
       Public Type PRINTER_DEFAULTS
    
           pDatatype As Long
           pDevmode As Long
           DesiredAccess As Long
       End Type
    
       Public Type PRINTER_INFO_2
           pServerName As Long
           pPrinterName As Long
           pShareName As Long
           pPortName As Long
           pDriverName As Long
           pComment As Long
           pLocation As Long
           pDevmode As Long       ' Wskaźnik do DEVMODE
           pSepFile As Long
           pPrintProcessor As Long
           pDatatype As Long
           pParameters As Long
           pSecurityDescriptor As Long  ' Wskaźnik do SECURITY_DESCRIPTOR
           Attributes As Long
    
    
           Priority As Long
           DefaultPriority As Long
           StartTime As Long
           UntilTime As Long
           Status As Long
           cJobs As Long
           AveragePPM As Long
       End Type
    
       Public Type DEVMODE
           dmDeviceName As String * 32
    
           dmSpecVersion As Integer
           dmDriverVersion As Integer
           dmSize As Integer
           dmDriverExtra As Integer
           dmFields As Long
           dmOrientation As Integer
           dmPaperSize As Integer
           dmPaperLength As Integer
           dmPaperWidth As Integer
           dmScale As Integer
           dmCopies As Integer
           dmDefaultSource As Integer
           dmPrintQuality As Integer
           dmColor As Integer
           dmDuplex As Integer
           dmYResolution As Integer
           dmTTOption As Integer
           dmCollate As Integer
           dmFormName As String * 32
           dmUnusedPadding As Integer
           dmBitsPerPel As Integer
           dmPelsWidth As Long
           dmPelsHeight As Long
           dmDisplayFlags As Long
           dmDisplayFrequency As Long
           dmICMMethod As Long
           dmICMIntent As Long
           dmMediaType As Long
           dmDitherType As Long
           dmReserved1 As Long
           dmReserved2 As Long
       End Type
    
       Public Const DM_DUPLEX = &H1000&
       Public Const DM_IN_BUFFER = 8
    
       Public Const DM_OUT_BUFFER = 2
       Public Const PRINTER_ACCESS_ADMINISTER = &H4
       Public Const PRINTER_ACCESS_USE = &H8
       Public Const STANDARD_RIGHTS_REQUIRED = &HF0000
       Public Const PRINTER_ALL_ACCESS = (STANDARD_RIGHTS_REQUIRED Or _
                 PRINTER_ACCESS_ADMINISTER Or PRINTER_ACCESS_USE)
    
       Public Declare Function ClosePrinter Lib "winspool.drv" _
        (ByVal hPrinter As Long) As Long
       Public Declare Function DocumentProperties Lib "winspool.drv" _
         Alias "DocumentPropertiesA" (ByVal hwnd As Long, _
         ByVal hPrinter As Long, ByVal pDeviceName As String, _
         ByVal pDevModeOutput As Long, ByVal pDevModeInput As Long, _
         ByVal fMode As Long) As Long
       Public Declare Function GetPrinter Lib "winspool.drv" Alias _
         "GetPrinterA" (ByVal hPrinter As Long, ByVal Level As Long, _
         pPrinter As Byte, ByVal cbBuf As Long, pcbNeeded As Long) As Long
       Public Declare Function OpenPrinter Lib "winspool.drv" Alias _
         "OpenPrinterA" (ByVal pPrinterName As String, phPrinter As Long, _
         pDefault As PRINTER_DEFAULTS) As Long
       Public Declare Function SetPrinter Lib "winspool.drv" Alias _
         "SetPrinterA" (ByVal hPrinter As Long, ByVal Level As Long, _
         pPrinter As Byte, ByVal Command As Long) As Long
    
       Public Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" _
        (pDest As Any, pSource As Any, ByVal cbLength As Long)
     
       ' ==================================================================
       ' SetPrinterDuplex.
       '
       '  Programowo ustawia flagę dupleksu dla określonych właściwości domyślnych
       '  sterownika drukarki.
       '
       '  Zwraca: prawdę w przypadku sukcesu i fałsz w przypadku błędu. W przypadku błędu
    
       '  wyświetlany jest również komunikat o błędzie. Jest to tylko komunikat
       '  informacyjny. Kod trzeba zmodyfikować w celu lepszej
       '  obsługi błędów w aplikacji użytkowej.
       '
       '  Parametry:
       '    sPrinterName - nazwa drukarki, która ma być używana.
       '
       '    nDuplexSetting - jedno z następujących ustawień standardowych:
       '       1 = Brak
       '       2 = Dupleks wzdłuż dłuższej krawędzi (książka)
       '       3 = Dupleks wzdłuż krótszej krawędzi (kalendarz)
       '
       ' ==================================================================
       Public Function SetPrinterDuplex(ByVal sPrinterName As String, _
       ByVal nDuplexSetting As Long) As Boolean
    
          Dim hPrinter As Long
          Dim pd As PRINTER_DEFAULTS
          Dim pinfo As PRINTER_INFO_2
          Dim dm As DEVMODE
       
          Dim yDevModeData() As Byte
          Dim yPInfoMemory() As Byte
          Dim nBytesNeeded As Long
          Dim nRet As Long, nJunk As Long
       
          On Error GoTo cleanup
       
          If (nDuplexSetting < 1) Or (nDuplexSetting > 3) Then
             MsgBox "Błąd: ustawienie dwDuplexSetting jest niepoprawne."
             Exit Function
          End If
          
          pd.DesiredAccess = PRINTER_ALL_ACCESS
          nRet = OpenPrinter(sPrinterName, hPrinter, pd)
          If (nRet = 0) Or (hPrinter = 0) Then
             If Err.LastDllError = 5 Then
                MsgBox "Odmowa dostępu — aby uzyskać więcej informacji, zobacz artykuł."
             Else
                MsgBox "Nie można otworzyć określonej drukarki " & _
                  "(upewnij się, czy nazwa drukarki jest poprawna)."
             End If
             Exit Function
          End If
       
          nRet = DocumentProperties(0, hPrinter, sPrinterName, 0, 0, 0)
          If (nRet < 0) Then
             MsgBox "Nie można pobrać rozmiaru struktury DEVMODE."
             GoTo cleanup
          End If
       
          ReDim yDevModeData(nRet + 100) As Byte
          nRet = DocumentProperties(0, hPrinter, sPrinterName, _
                      VarPtr(yDevModeData(0)), 0, DM_OUT_BUFFER)
          If (nRet < 0) Then
             MsgBox "Nie można pobrać struktury DEVMODE."
             GoTo cleanup
          End If
       
          Call CopyMemory(dm, yDevModeData(0), Len(dm))
       
          If Not CBool(dm.dmFields And DM_DUPLEX) Then
            MsgBox "Nie można zmodyfikować flagi dupleksu dla tej drukarki, " & _
                   "ponieważ nie obsługuje ona dupleksu lub sterownik " & _
                   "nie obsługuje ustawiania go za pomocą interfejsu Windows API."
             GoTo cleanup
          End If
       
          dm.dmDuplex = nDuplexSetting
          Call CopyMemory(yDevModeData(0), dm, Len(dm))
       
          nRet = DocumentProperties(0, hPrinter, sPrinterName, _
            VarPtr(yDevModeData(0)), VarPtr(yDevModeData(0)), _
            DM_IN_BUFFER Or DM_OUT_BUFFER)
    
          If (nRet < 0) Then
            MsgBox "Nie można ustawić dupleksu dla tej drukarki."
            GoTo cleanup
          End If
       
          Call GetPrinter(hPrinter, 2, 0, 0, nBytesNeeded)
          If (nBytesNeeded = 0) Then GoTo cleanup
       
          ReDim yPInfoMemory(nBytesNeeded + 100) As Byte
    
          nRet = GetPrinter(hPrinter, 2, yPInfoMemory(0), nBytesNeeded, nJunk)
          If (nRet = 0) Then
             MsgBox "Nie można pobrać ustawień drukarki udostępnionej."
             GoTo cleanup
          End If
       
          Call CopyMemory(pinfo, yPInfoMemory(0), Len(pinfo))
          pinfo.pDevmode = VarPtr(yDevModeData(0))
          pinfo.pSecurityDescriptor = 0
          Call CopyMemory(yPInfoMemory(0), pinfo, Len(pinfo))
       
          nRet = SetPrinter(hPrinter, 2, yPInfoMemory(0), 0)
          If (nRet = 0) Then
             MsgBox "Nie można ustawić właściwości drukarki udostępnionej."
          End If
       
          SetPrinterDuplex = CBool(nRet)
    
    cleanup:
          If (hPrinter <> 0) Then Call ClosePrinter(hPrinter)
    
       End Function
    
    
    
  3. Dodaj standardowy przycisk CommandButton do formularza Form1.
  4. Dodaj następujący kod w oknie kodu formularza Form1:
          
       Option Explicit
       Private Sub Command1_Click()
          Dim oWord As Object
          Dim oDoc As Object
          
          Set oWord = CreateObject("Word.application")
    
          oWord.Visible = True
          
          Set oDoc = oWord.Documents.Add
          oDoc.Range.Select
          
    
          oWord.Selection.TypeText "To jest na stronie 1" & vbCr
          oWord.Selection.InsertBreak 1
          oWord.Selection.TypeText "To jest strona 2"
          
          SetPrinterDuplex Printer.DeviceName, 2
          
          oDoc.PrintOut Background:=False
          
          SetPrinterDuplex Printer.DeviceName, 1
          
          MsgBox "Wydruk gotowy", vbMsgBoxSetForeground
          
          oDoc.Saved = True
          oDoc.Close
          Set oDoc = Nothing
       
          oWord.Quit
          Set oWord = Nothing
       End Sub	
    
    					
  5. Uruchom przykład.

    Jeśli drukarka obsługuje drukowanie dwustronne, dokument testowy jest drukowany po obu stronach arkusza papieru.

Materiały referencyjne

Aby uzyskać więcej informacji o problemach, które mogą wystąpić przy próbie dwustronnego drukowania dokumentów programu Word, kliknij następujące numery artykułów w celu wyświetlenia tych artykułów z bazy wiedzy Microsoft Knowledge Base:
176189 Shading of solid black or gray won't print duplex on NT
196857 First page prints on back of last page with duplex
214683 Duplex printing does not work with objects on page

Właściwości

Numer ID artykułu: 828638 - Ostatnia weryfikacja: 24 maja 2006 - Weryfikacja: 3.0
Informacje zawarte w tym artykule dotyczą:
  • Microsoft Office Word 2003
  • Microsoft Visual Basic 5.0 Professional Edition
  • Microsoft Visual Basic 6.0 Professional Edition
  • Microsoft Visual Basic 5.0 Enterprise Edition
  • Microsoft Visual Basic 6.0 Enterprise Edition
Słowa kluczowe: 
kbhowtomaster kbapi kbautomation kbhowto kbprint KB828638

Przekaż opinię

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com