Comment faire pour activer et désactiver une imprimante en utilisant la fonction SetPrinter dans Visual C#

Traductions disponibles Traductions disponibles
Numéro d'article: 315720 - Voir les produits auxquels s'applique cet article
Agrandir tout | Réduire tout

Sommaire

Résumé

Cet article étape par étape vous explique comment par programmation activer et désactiver la fonctionnalité impression sur une imprimante installée sur un ordinateur qui prend en charge l'interface de programmation d'application Win32 (API) de Visual C#.

Configuration requise

Vous devez les matériels et logiciels pour effectuer les procédures décrites dans cet article suivants :
  • Un Microsoft Windows NT, Microsoft Windows 2000, Microsoft Windows Server 2003 ou ordinateur Windows XP
  • Microsoft Visual Studio .NET ou Microsoft Visual Studio 2005
Vous devez les compétences suivantes pour effectuer les procédures décrites dans cet article :
  • Environnement de programmation C#
  • Connaissance de base de l'API Windows

Créer une application pour contrôler l'imprimante

Pour créer une application pour contrôler l'imprimante, procédez comme suit :
  1. Démarrez Visual Studio .NET ou Visual Studio 2005, puis créer un nouveau projet d'application de console Visual C# nommé PrinterControl.
  2. Modifier Class1.cs dans Visual Studio .NET ou Program.cs dans Visual Studio 2005. Après l'instruction à l'aide système; Ajoutez l'instruction suivante :
    using System.Runtime.InteropServices;
    					
  3. Au début du corps de la classe Class1 dans Visual Studio .NET ou classe programme dans Visual Studio 2005, ajoutez la déclaration structure suivante :
    unsafe struct PRINTER_DEFAULTS
    { 
        public void * pDatatype;     // LPTSTR
        public void * pDevMode;      // LPDEVMODE
        public uint   DesiredAccess; // ACCESS_MASK
    };
    					
  4. Après la déclaration de structure, ajoutez les déclarations suivantes des fonctions API de 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. Après la déclaration de fonction, complément constantes suivantes pour utiliser les fonctions API de 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. Vous pouvez appeler les fonctions API Windows directement dans votre code. Toutefois, il est plus pratique pour les placer dans des fonctions wrapper qui gérer le code unsafe et fournissent via les exceptions de gestion des erreurs. Ajouter les fonctions wrapper suivante dans 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. Ajoutez le code suivant dans la fonction principale pour appeler les fonctions wrapper pour montrer les opérations de contrôle d'imprimante (vous devrez peut-être spécifier votre nom d'imprimante dans l'appel de fonction 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);
        }
    }
    					
    hPrinter = CSOpenPrinter("YourPrinterName") CSDisablePrinter(hPrinter) Console.WriteLine (« l'imprimante est désactivé"); Console.ReadLine() ; CSEnablePrinter(hPrinter) ; Console.WriteLine (« l'imprimante est activé »); Console.ReadLine() ; CSPausePrinter(hPrinter) ; Console.WriteLine (« l'imprimante est en pause »); Console.ReadLine() ; CSResumePrinter(hPrinter) ; Console.WriteLine (« l'imprimante est reprise »); Console.ReadLine() ; CSClosePrinter(hPrinter);} catch (e ApplicationException) {Console.WriteLine("Exception: {0}", e.Message);}}

Créer l'application

Avant de commencer l'application à créer, vous devez activer la compilation de code non sécurisé pour votre projet.

Pour ce faire, procédez comme suit :
  1. Dans l'Explorateur de solutions, cliquez avec le bouton droit sur PrinterControl , puis cliquez sur Propriétés dans le menu contextuel.
  2. Dans la boîte de dialogue pages de propriétés PrinterControl , cliquez sur Propriétés de configuration , puis définissez les blocs de code dangereux Autoriser sur la valeur True .

    note Dans Visual Studio 2005, cliquez sur Créer dans la boîte de dialogue pages de propriétés PrintControl , puis cliquez sur Activer la case à cocher code unsafe Autoriser .
  3. Cliquez sur OK .
  4. Générez l'application.

Vérification

  1. Avant d'exécuter l'application, ouvrez la fenêtre Imprimantes pour afficher le nom et l'état de chaque imprimante sur votre ordinateur.

    Pour ce faire, dans Windows XP, cliquez sur Démarrer , puis cliquez sur Imprimantes et télécopieurs .

    Dans Windows Server 2003, Windows 2000, Windows NT, Windows Millennium et Microsoft Windows 98, cliquez sur Démarrer , pointez sur Paramètres et puis puis cliquez sur Imprimantes .
  2. Exécuter votre application dans Visual Studio .NET ou Visual Studio 2005.
  3. L'application affiche le message suivant :
    L'imprimante est désactivé
    Vérifiez que l'imprimante est désactivé par regarder dans le dossier Imprimantes. Appuyez sur ENTRÉE dans la fenêtre d'application, pour continuer l'application.
    Appuyez sur ENTRÉE.
  4. L'application affiche le message suivant :
    L'imprimante est activée
    Vérifiez que l'imprimante est activée en regardant dans le dossier Imprimantes. Appuyez sur ENTRÉE dans la fenêtre d'application, pour continuer l'application.
    Appuyez sur ENTRÉE.
  5. L'application affiche le message suivant :
    L'imprimante est en pause
    Vérifiez que l'imprimante est en pause en regardant dans le dossier Imprimantes. Appuyez sur ENTRÉE dans la fenêtre d'application, pour continuer l'application.
    Appuyez sur ENTRÉE.
  6. L'application affiche le message suivant :
    Reprise de l'imprimante
    Vérifiez que l'imprimante est repris en regardant dans le dossier Imprimantes. Appuyez sur ENTRÉE dans la fenêtre d'application, pour continuer l'application.
    Appuyez sur ENTRÉE. L'application s'arrête.

Résolution des problèmes

La fonction SetPrinter requiert des autorisations appropriées sur Windows XP, Windows 2000, Windows Server 2003 et systèmes Windows_NT-based. Si vous n'avez pas de droits administratifs sur l'imprimante spécifiée, l'appel de fonction SetPrinter échoue.

Références

Pour plus d'informations, cliquez sur le numéro ci-dessous pour afficher l'article correspondant dans la Base de connaissances Microsoft :
160129 Comment faire pour obtenir l'état d'une imprimante et un travail d'impression

Propriétés

Numéro d'article: 315720 - Dernière mise à jour: lundi 11 décembre 2006 - Version: 3.3
Les informations contenues dans cet article s'appliquent au(x) produit(s) suivant(s):
  • Microsoft Visual C# .NET 2002 Initiation
  • Microsoft Visual C# 2005 Express Edition
Mots-clés : 
kbmt kbhowtomaster KB315720 KbMtfr
Traduction automatique
IMPORTANT : Cet article est issu du système de traduction automatique mis au point par Microsoft (http://support.microsoft.com/gp/mtdetails). Un certain nombre d?articles obtenus par traduction automatique sont en effet mis à votre disposition en complément des articles traduits en langue française par des traducteurs professionnels. Cela vous permet d?avoir accès, dans votre propre langue, à l?ensemble des articles de la base de connaissances rédigés originellement en langue anglaise. Les articles traduits automatiquement ne sont pas toujours parfaits et peuvent comporter des erreurs de vocabulaire, de syntaxe ou de grammaire (probablement semblables aux erreurs que ferait une personne étrangère s?exprimant dans votre langue !). Néanmoins, mis à part ces imperfections, ces articles devraient suffire à vous orienter et à vous aider à résoudre votre problème. Microsoft s?efforce aussi continuellement de faire évoluer son système de traduction automatique.
La version anglaise de cet article est la suivante: 315720
L'INFORMATION CONTENUE DANS CE DOCUMENT EST FOURNIE PAR MICROSOFT SANS GARANTIE D'AUCUNE SORTE, EXPLICITE OU IMPLICITE. L'UTILISATEUR ASSUME LE RISQUE DE L'UTILISATION DU CONTENU DE CE DOCUMENT. CE DOCUMENT NE PEUT ETRE REVENDU OU CEDE EN ECHANGE D'UN QUELCONQUE PROFIT.

Envoyer des commentaires

 

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