Come attivare e disattivare una stampante utilizzando la funzione SetPrinter in Visual C#

Traduzione articoli Traduzione articoli
Identificativo articolo: 315720 - Visualizza i prodotti a cui si riferisce l?articolo.
Espandi tutto | Chiudi tutto

In questa pagina

Sommario

In questo articolo viene illustrato come attivare e disattivare la funzionalitÓ di stampa su una stampante installata in un computer che supporta il Win32 application programming interface (API) in Visual C# a livello di codice.

Requisiti

╚ necessario disporre di hardware e software per eseguire le procedure descritte in questo articolo riportato di seguito:
  • Un Microsoft Windows NT, Microsoft Windows 2000, Microsoft Windows Server 2003 o computer basato su Microsoft Windows XP
  • Microsoft Visual Studio .NET o Microsoft Visual Studio 2005
╚ necessario che le competenze seguenti per eseguire le procedure descritte in questo articolo:
  • Esperienza di programmazione C#
  • Conoscenza di base dell'API Windows

Creazione di un'applicazione per controllare la stampante

Per creare un'applicazione per controllare la stampante, attenersi alla seguente procedura:
  1. Avviare Visual Studio .NET o Visual Studio 2005 e quindi creare un nuovo progetto applicazione console di Visual C# denominato PrinterControl.
  2. Modificare Class1.cs in Visual Studio .NET o Program.cs in Visual Studio 2005. Dopo l'istruzione using System; aggiungere la seguente istruzione:
    using System.Runtime.InteropServices;
    					
  3. All'inizio del corpo della classe Class1 in Visual Studio .NET o classe programma in Visual Studio 2005, aggiungere la seguente dichiarazione di struttura:
    unsafe struct PRINTER_DEFAULTS
    { 
        public void * pDatatype;     // LPTSTR
        public void * pDevMode;      // LPDEVMODE
        public uint   DesiredAccess; // ACCESS_MASK
    };
    					
  4. Dopo la dichiarazione di struttura, aggiungere le seguenti dichiarazioni per le funzioni API Windows:
    [DllImport("kernel32", SetLastError=true)]
    static extern int GetLastError();
    
    [DllImport("WinSpool.drv", SetLastError=true)]
    static extern unsafe bool OpenPrinter
    (string pPrinterName, int * phPrinter, void * pDefault);
    
    [DllImport("WinSpool.drv", SetLastError=true)]
    static extern bool ClosePrinter(int hPrinter);
    
    [DllImport("WinSpool.drv",SetLastError=true)]
    static extern unsafe bool SetPrinter
    (int hPrinter, uint Level, void * pPrinter, uint Command);
    					
  5. Dopo la dichiarazione di funzione, aggiungere le seguenti costanti per l'utilizzo nelle funzioni API di Windows:
    const uint PRINTER_ACCESS_ADMINISTER = 0x00000004;
    const uint PRINTER_STATUS_OFFLINE = 0x00000080;
    const uint PRINTER_CONTROL_PAUSE = 1;    
    const uint PRINTER_CONTROL_RESUME = 2;
    const uint PRINTER_CONTROL_PURGE = 3;
    const uint PRINTER_CONTROL_SET_STATUS = 4;
    					
  6. ╚ possibile chiamare le funzioni API di Windows direttamente nel codice. Tuttavia, Ŕ opportuno inserirli nelle funzioni wrapper che consentono di gestiscono il codice unsafe e forniscono tramite le eccezioni di gestione errori. Aggiungere le seguenti funzioni di wrapper di Class1:
    // Open a printer for administration operations.
    static unsafe int CSOpenPrinter(string printerName)
    {
        bool bResult;
        int hPrinter;
        PRINTER_DEFAULTS pd;
    
        pd.pDatatype     = null;
        pd.pDevMode      = null;
        pd.DesiredAccess = PRINTER_ACCESS_ADMINISTER;
        
        bResult = OpenPrinter(printerName, &hPrinter, &pd);
        if (!bResult)
        {
            throw new ApplicationException("Cannot open printer '" + 
                                            printerName + "' " + 
                                            Marshal.GetLastWin32Error());
        }
        return hPrinter;
    }
    
    // Close the printer.
    static void CSClosePrinter(int hPrinter)
    {
        if (!ClosePrinter(hPrinter))
        {
            throw new ApplicationException("Cannot close printer " +
                                            Marshal.GetLastWin32Error());
        }
    }
    
    // Pause printer.
    static unsafe void CSPausePrinter(int hPrinter)
    {
        if (!SetPrinter(hPrinter, 0, null, PRINTER_CONTROL_PAUSE))
        {
            throw new ApplicationException("Cannot pause printer " + 
                                            Marshal.GetLastWin32Error());
        }
    }
    
    // Resume printer.
    static unsafe void CSResumePrinter(int hPrinter)
    {
        if (!SetPrinter(hPrinter, 0, null, PRINTER_CONTROL_RESUME))
        {
            throw new ApplicationException("Cannot resume printer " + 
                                            Marshal.GetLastWin32Error());
        }
    }
    
    // Disable printer (offline).
    static unsafe void CSDisablePrinter(int hPrinter)
    {
        if (!SetPrinter(hPrinter, 0, 
                       (byte*)PRINTER_STATUS_OFFLINE, 
                        PRINTER_CONTROL_SET_STATUS))
        {
            throw new ApplicationException("Cannot disable printer " + 
                                            Marshal.GetLastWin32Error());
        }
    }
    
    // Enable printer.
    static unsafe void CSEnablePrinter(int hPrinter)
    {
        if (!SetPrinter(hPrinter, 0, (byte*)0, PRINTER_CONTROL_SET_STATUS))
        {
            throw new ApplicationException("Cannot enable printer " + 
                                            Marshal.GetLastWin32Error());
        }
    }
    					
  7. Aggiungere il seguente codice nella funzione Main per chiamare le funzioni wrapper per illustrare le operazioni di controllo della stampante (Ŕ necessario specificare il nome della stampante nella chiamata di funzione CSOpenPrinter ):
    [STAThread]
    static void Main(string[] args)
    {
        int hPrinter;
        try
        {
      // Edit the following line to match your printer name.
            hPrinter = CSOpenPrinter("YourPrinterName");
    
            CSDisablePrinter(hPrinter);
            Console.WriteLine("The printer is disabled");
            Console.ReadLine();
    
            CSEnablePrinter(hPrinter);
            Console.WriteLine("The printer is enabled");
            Console.ReadLine();
    
            CSPausePrinter(hPrinter);
            Console.WriteLine("The printer is paused");
            
            Console.ReadLine();
            CSResumePrinter(hPrinter);
            
            Console.WriteLine("The printer is resumed");
            Console.ReadLine();
            
            CSClosePrinter(hPrinter);
        }
        catch (ApplicationException e)
        {
            Console.WriteLine("Exception: {0}", e.Message);
        }
    }
    					

Compilare l'applicazione

Prima di creare l'applicazione, Ŕ necessario attivare compilazione di codice unsafe per il progetto.

Per effettuare questa operazione, attenersi alla seguente procedura:
  1. In Esplora soluzioni, fare clic con il pulsante destro del mouse su PrinterControl e quindi scegliere ProprietÓ dal menu di scelta rapida.
  2. Nella finestra di dialogo Pagine delle proprietÓ di PrinterControl , fare clic su ProprietÓ di configurazione e impostarne Consenti blocchi di codice unsafe su true .

    Nota In Visual Studio 2005, fare clic su Genera nella finestra di dialogo Pagine delle proprietÓ di PrintControl e quindi fare clic per selezionare la casella di controllo codice di Consenti unsafe .
  3. Fare clic su OK .
  4. Compilare l'applicazione.

Verifica

  1. Prima di eseguire l'applicazione, aprire la finestra di stampanti per visualizzare il nome e il stato di ciascuna stampante del computer.

    Per eseguire questa operazione in Windows XP, fare clic su Start e quindi fare clic su stampanti e fax .

    In Windows Server 2003, Windows 2000, Windows NT, Microsoft Windows Millennium Edition e Microsoft Windows 98, fare clic su Start , scegliere Impostazioni e quindi fare clic quindi su stampanti .
  2. Eseguire l'applicazione in Visual Studio .NET o in Visual Studio 2005.
  3. L'applicazione viene visualizzato il seguente messaggio:
    La stampante Ŕ disattivata.
    Verificare che la stampante sia disattivata cercando nella cartella stampanti. Premere INVIO nella finestra dell'applicazione per l'applicazione di continuare.
    Premere INVIO.
  4. L'applicazione viene visualizzato il seguente messaggio:
    La stampante Ŕ attivata.
    Verificare che la stampante sia attivata cercando nella cartella stampanti. Premere INVIO nella finestra dell'applicazione per l'applicazione di continuare.
    Premere INVIO.
  5. L'applicazione viene visualizzato il seguente messaggio:
    La stampante Ŕ in pausa
    Verificare che la stampante Ŕ in pausa cercando nella cartella stampanti. Premere INVIO nella finestra dell'applicazione per l'applicazione di continuare.
    Premere INVIO.
  6. L'applicazione viene visualizzato il seguente messaggio:
    La stampante Ŕ ripresa.
    Verificare che la stampante viene ripreso cercando nella cartella stampanti. Premere INVIO nella finestra dell'applicazione per l'applicazione di continuare.
    Premere INVIO. L'applicazione viene terminata.

Risoluzione dei problemi

La funzione di SetPrinter richiede autorizzazioni appropriate per Windows XP, Windows 2000 Windows Server 2003 e sistemi Windows_NT-based. Se non si dispone dei diritti amministrativi per la stampante specificata, la chiamata di funzione di SetPrinter avrÓ esito negativo.

Riferimenti

Per ulteriori informazioni, fare clic sul numero dell'articolo della Microsoft Knowledge Base riportato di seguito:
160129HOWTO: Carica lo stato di una stampante e un processo di stampa

ProprietÓ

Identificativo articolo: 315720 - Ultima modifica: lunedý 11 dicembre 2006 - Revisione: 3.3
Le informazioni in questo articolo si applicano a:
  • Microsoft Visual C# .NET 2002 Standard Edition
  • Microsoft Visual C# 2005 Express Edition
Chiavi:á
kbmt kbhowtomaster KB315720 KbMtit
Traduzione automatica articoli
Il presente articolo Ŕ stato tradotto tramite il software di traduzione automatica di Microsoft e non da una persona. Microsoft offre sia articoli tradotti da persone fisiche sia articoli tradotti automaticamente da un software, in modo da rendere disponibili tutti gli articoli presenti nella nostra Knowledge Base nella lingua madre dell?utente. Tuttavia, un articolo tradotto in modo automatico non Ŕ sempre perfetto. Potrebbe contenere errori di sintassi, di grammatica o di utilizzo dei vocaboli, pi¨ o meno allo stesso modo di come una persona straniera potrebbe commettere degli errori parlando una lingua che non Ŕ la sua. Microsoft non Ŕ responsabile di alcuna imprecisione, errore o danno cagionato da qualsiasi traduzione non corretta dei contenuti o dell?utilizzo degli stessi fatto dai propri clienti. Microsoft, inoltre, aggiorna frequentemente il software di traduzione automatica.
Clicca qui per visualizzare la versione originale in inglese dell?articolo: 315720
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.

Invia suggerimenti

 

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