Newsgroup: it.comp.programmare.win32
Titolo: Come stampare un documento su una stampante specifica?

Da codice dovrei mandare in stampa un dato documento su una data stampante.
Ad esempio il file   "test.pdf"    sulla stampante   "Hp Laserjet 4600"
A priori non conosco ne la stampante (ma so che esiste nel sistema) ne il
formato del file (ma il sistema comunque ha un programma associato).
Avendo queste due informazioni (nome file e nome stampante) come faccio a
mandare in stampa il file sulla stampante?
Grazie, Max


TROVATO!
Uso ShellExecute con il verbo "PrintTo" (poco documentato, ma supportato)
che permette di mandare in stampa su una stampante specifica.
Dal sito Microsoft:
===========================
            Knowledge Base italiana - Articolo aggiornato il 31-05-1999
            Come stampare file tramite l'Ole verb 'PrintTo'
--------------------------------------------------------------------------
      Le informazioni in questo articolo si applicano a:
        a.. Microsoft Visual Basic for Windows
        b.. Microsoft Visual Basic for Windows, 32-bit
--------------------------------------------------------------------------
      Sommario
      Questo articolo spiega come stampare un file da Visual Basic,
utilizzando l'ole verb 'PrintTo' messo a disposizione dalla eventuale
estensione della shell (Shell Extension) associata alla classe di file, di
cui il file da stampare fa parte.
      Questo esempio illustra inoltre come attendere, da programma, il
termine dell'esecuzione del processo di stampa.
      Informazioni
      Windows definisce un insieme di ole verb, detti canonici, che
introducono un elemento standard ai menu di contesto forniti dalle
estensioni di shell. L'ole verb 'PrintTo' fa parte dei verb canonici, anche
se generalmente non e' visualizzato nei menu di contesto. Esso permette
all'utente di stampare un file mediante trascinamento dell'icona di questo
sull'icona della stampante prescelta per la stampa. Gli ole verb canonici
sono anche forniti dagli handler dei menu di contesto (Shell Extension
Handler). Il seguente esempio usa la funzione ShellExecuteEx delle API di
Windows per invocare l'ole verb PrintTo e per recuperare un handle al
processo che lo implementa, con il fine di attendere il termine della
stampa.
      Esempio
        1.. Aprire un nuovo progetto Visual Basic con un form.
        2.. Introdurre sul form i seguenti controlli, nel seguente ordine,
lasciando i nomi di default:
   un Command Button con caption "Stampa sulla stampante di default"
   un Command Button con caption "Stampa sulla stampante prescelta"
   una Text Box in cui introdurre il path del file da stampare
   una Text Box in cui introdurre il nome della stampante prescelta
   una ListBox per elencare le stampanti presenti sul sistema
        3.. Associare al form il seguente codice:
Private Type SHELLEXECUTEINFO
        cbSize As Long
        fMask As Long
        hwnd As Long
        lpVerb As String
        lpFile As String
        lpParameters As String
        lpDirectory As String
        nShow As Long
        hInstApp As Long
        '  Optional fields
        lpIDList As Long
        lpClass As String
        hkeyClass As Long
        dwHotKey As Long
        hIcon As Long
        hProcess As Long
End Type
Const SW_SHOWMINNOACTIVE = 7
Const SEE_MASK_NOCLOSEPROCESS = &H40
Const WAIT_TIMEOUT = &H102
Private Declare Function WaitForSingleObject Lib "kernel32" (ByVal _
    hHandle As Long, ByVal dwMilliseconds As Long) As Long
Private Declare Function ShellExecuteEx Lib "shell32.dll" Alias
"ShellExecuteExA" _
    (lpExecInfo As SHELLEXECUTEINFO) As Long
' Another good function
'Private Declare Function ShellExecuteAny Lib "shell32.dll" Alias _
' "ShellExecuteA" _
' (ByVal hwnd As Long, ByVal lpOperation As String, ByVal lpFile _
' As String, ByVal lpParameters As Any, ByVal lpDirectory As Any, _
' ByVal nShowCmd As Long) As Long
Private Sub Command2_Click()
    PrintFile Text1.Text, Text2.Text, vbNullString, vbNullString
End Sub
Private Sub Command1_Click()
    PrintFile Text1.Text, vbNullString, vbNullString, vbNullString
End Sub
' La valorizzazione degli ultimi due parametri della seguente
' procedura puo' essere necessaria a seconda della Shell
' Extension usata (per la particolare classe di file)
' e/o del sistema operativo
Private Sub PrintFile( _
    ByVal FileToPrint As String, _
    ByVal PrinterName As String, _
    ByVal DriverName As String, _
    ByVal PortName As String)
    Dim Ret As Long
    Dim lpExecInfo As SHELLEXECUTEINFO
    Dim Verb As String
    Verb = IIf(PrinterName = vbNullString, "print", "printto")
    lpExecInfo.cbSize = Len(lpExecInfo)
    lpExecInfo.fMask = SEE_MASK_NOCLOSEPROCESS
    lpExecInfo.hwnd = Me.hwnd
    lpExecInfo.lpVerb = Verb
    lpExecInfo.lpFile = FileToPrint
    lpExecInfo.lpParameters = _
      Chr(34) & PrinterName & Chr(34) & " " & _
      Chr(34) & DriverName & Chr(34) & " " & _
      Chr(34) & PortName & Chr(34)
    lpExecInfo.lpDirectory = vbNullString
    lpExecInfo.nShow = SW_SHOWMINNOACTIVE
    lpExecInfo.hInstApp = 0&
    '  Optional fields
    lpExecInfo.lpIDList = 0&
    lpExecInfo.lpClass = vbNullString
    lpExecInfo.hkeyClass = 0&
    lpExecInfo.dwHotKey = 0&
    lpExecInfo.hIcon = 0&
    lpExecInfo.hProcess = 0&
    Ret = ShellExecuteEx(lpExecInfo)
    If Ret = 0 Then
        MsgBox "Problems with printing"
        Exit Sub
    End If
    Ret = WaitForSingleObject(lpExecInfo.hProcess, 100)
    Do
        Ret = WaitForSingleObject(lpExecInfo.hProcess, 0)
    Loop Until Ret <> WAIT_TIMEOUT
    MsgBox "Printing has finished"
End Sub
Private Sub Form_Load()
    Dim x As Printer
    For Each x In Printers
        List1.AddItem x.DeviceName
    Next
End Sub
Private Sub List1_Click()
    Text2.Text = List1.List(List1.ListIndex)
End Sub
      Riferimenti
        a.. "Extending the Shell", in Microsoft Developer Network (MSDN)
        b.. Documentazione di ShellExecuteEx, MSDN
        c.. (gli articoli con prefisso "Q" contengono informazioni in
inglese)
          ID ARTICOLO: Q147807
          TITOLO: How to Launch App Based on File Extension Using
ShellExecute,
        (MSDN Library, Knowledge Base)
        d.. "Using Associations to Find and Start Applications" (MSDN
Library, Platform, SDK, and DDK Documentation)
        e.. ID ARTICOLO: Q129796
          TITOLO: How to Determine When a Shelled 32-bit Process Has
Terminated,
        (MSDN Library, Knowledge Base)
        f.. Tip 168: Using the ShellExecute Function to Print Files (MSDN
Library, Technical Articles)
        g.. WaitForSingleObject, QuickInfo.
        h.. ID ARTICOLO: Q129797
          TITOLO: How to Launch a Win32 Application from Visual Basic
        (MSDN Library, Knowledge Base)
        i.. "Tip 173: Launching Applications in Visual Basic" (MSDN Library,
Technical Articles)
      Parole di ricerca aggiuntive: printer printing waiting launching
process indipendente diversa differente
            Parole Chiave:
            Tipo di problema:
            Tecnologia:
            TUTTE LE INFORMAZIONI PRESENTI NELLA KNOWLEDGE BASE SONO DI
PROPRIETA' MICROSOFT
              LE INFORMAZIONI CONTENUTE NELLA MICROSOFT KNOWLEDGE BASE SONO
FORNITE SENZA GARANZIA DI ALCUN TIPO, IMPLICITA OD ESPLICITA, COMPRESA
QUELLA RIGUARDO ALLA COMMERCIALIZZAZIONE E/O COMPATIBILITA' IN IMPIEGHI
PARTICOLARI. L'UTENTE SI ASSUME L'INTERA RESPONSABILITA' PER L'UTILIZZO DI
QUESTE INFORMAZIONI. IN NESSUN CASO MICROSOFT CORPORATION E I SUOI FORNITORI
SI RENDONO RESPONSABILI PER DANNI DIRETTI, INDIRETTI O ACCIDENTALI CHE
POSSANO PROVOCARE PERDITA DI DENARO O DI DATI, ANCHE SE MICROSOFT O I SUOI
FORNITORI FOSSERO STATI AVVISATI. IL DOCUMENTO PUO' ESSERE COPIATO E
DISTRIBUITO ALLE SEGUENTI CONDIZIONI: 1) IL TESTO DEVE ESSERE COPIATO
INTEGRALMENTE E TUTTE LE PAGINE DEVONO ESSERE INCLUSE. 2) I PROGRAMMI SE
PRESENTI, DEVONO ESSERE COPIATI SENZA MODIFICHE, 3) IL DOCUMENTO DEVE ESSERE
DISTRIBUITO INTERAMENTE IN OGNI SUA PARTE. 4) IL DOCUMENTO NON PUO' ESSERE
DISTRIBUITO A SCOPO DI LUCRO.
      Ultima Revisione: 31-05-1999
      © 2001 Microsoft Corporation. Tutti i diritti sono riservati. Note
legali.