Como activar e desactivar uma impressora utilizando a função SetPrinter no Visual c#

IMPORTANTE: Este artigo foi traduzido por um sistema de tradução automática (também designado por Machine translation ou MT), não tendo sido portanto revisto ou traduzido por humanos. A Microsoft tem artigos traduzidos por aplicações (MT) e artigos traduzidos por tradutores profissionais. O objectivo é simples: oferecer em Português a totalidade dos artigos existentes na base de dados do suporte. Sabemos no entanto que a tradução automática não é sempre perfeita. Esta pode conter erros de vocabulário, sintaxe ou gramática… erros semelhantes aos que um estrangeiro realiza ao falar em Português. A Microsoft não é responsável por incoerências, erros ou estragos realizados na sequência da utilização dos artigos MT por parte dos nossos clientes. A Microsoft realiza actualizações frequentes ao software de tradução automática (MT). Obrigado.

Clique aqui para ver a versão em Inglês deste artigo: 315720
Este artigo refere-se ao espaço de nomes de biblioteca de classes do Microsoft .NET Framework seguintes:
  • System.Runtime.InteropServices

NESTA TAREFA

Sumário
Este artigo passo a passo mostra como activar e desactivar a funcionalidade de impressão numa impressora instalada num computador que suporta a interface de programação de aplicações do Win32 (API) do c# através de programação.

Requisitos

É necessário o seguinte hardware e software para executar os procedimentos descritos neste artigo:
  • Um Microsoft Windows NT, o Microsoft Windows 2000, o Microsoft Windows Server 2003 ou o computador baseado no Microsoft Windows XP
  • Microsoft Visual Studio .NET ou Microsoft Visual Studio 2005
Tem as seguintes competências para executar os procedimentos descritos neste artigo:
  • C# experiência de programação
  • Conhecimento básico da API do Windows

Criar uma aplicação controle a impressora

Para criar uma aplicação controle a impressora, siga estes passos:
  1. Inicie o Visual Studio .NET ou Visual Studio 2005 e, em seguida, crie um novo Visual c# consola projecto de aplicação com o nome PrinterControl.
  2. Edite Class1.cs no Visual Studio .NET ou Program.cs no Visual Studio 2005. Depois da instrução utilizando o sistema; adicione a seguinte instrução:
    using System.Runtime.InteropServices;					
  3. No início do corpo de classe Class1 no Visual Studio .NET ou programa no Visual Studio 2005, adicione a seguinte declaração de estrutura:
    unsafe struct PRINTER_DEFAULTS{     public void * pDatatype;     // LPTSTR    public void * pDevMode;      // LPDEVMODE    public uint   DesiredAccess; // ACCESS_MASK};					
  4. Após a declaração de estrutura, adicione as seguintes declarações para as funções da API do 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. Após a declaração de função, adicione as seguintes constantes para utilização nas funções da API do 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. Pode chamar as funções API do Windows directamente no código. No entanto, é mais conveniente para colocá-los em funções de wrapper que processam o código não seguro e fornecem através de excepções de processamento de erros. Adicione as seguintes funções de wrapper 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. Adicione o seguinte código na função principal para chamar as funções de wrapper para demonstrar as operações de controlo da impressora (terá de especificar o nome da impressora na chamada de função 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);    }}					

Compilar a aplicação

Antes de criar a aplicação, tem de activar compilação de código não seguro para o projecto.

Para tal, siga estes passos:
  1. No Solution Explorer, com o botão direito PrinterControle, em seguida, clique em Propriedades no menu de atalho.
  2. Na caixa de diálogo Páginas de propriedades de PrinterControl , clique em Propriedades de configuraçãoe, em seguida, defina Permitir blocos de código não seguro como True.

    Nota No Visual Studio 2005, clique em Criar na caixa de diálogo de Páginas de propriedades PrintControl e, em seguida, clique para seleccionar a caixa de verificação Permitir que código não seguro .
  3. Clique em OK.
  4. Compilar a aplicação.

Verificação

  1. Antes de executar a aplicação, abra a janela de impressoras para apresentar o nome e o estado de cada impressora no computador.

    Para efectuar este procedimento no Windows XP, clique em Iniciare, em seguida, clique em Impressoras e Faxes.

    No Windows Server 2003, Windows 2000, Windows NT, Microsoft Windows Millennium Edition e Microsoft Windows 98, clique em Iniciar, aponte para Definiçõese, em seguida, em seguida, clique em impressoras.
  2. Execute a aplicação em Visual Studio .NET ou no Visual Studio 2005.
  3. A aplicação apresenta a seguinte mensagem:
    A impressora está desactivada
    Verifique se que a impressora está desactivada através da procura na pasta Impressoras. Prima Enter na janela da aplicação, para continuar a aplicação.
    Prima ENTER.
  4. A aplicação apresenta a seguinte mensagem:
    A impressora está activada
    Certifique-se de que a impressora está activada através da procura na pasta Impressoras. Prima Enter na janela da aplicação, para continuar a aplicação.
    Prima ENTER.
  5. A aplicação apresenta a seguinte mensagem:
    A impressora está parada
    Certifique-se de que a impressora está parada ao procurar na pasta ' Impressoras '. Prima Enter na janela da aplicação, para continuar a aplicação.
    Prima ENTER.
  6. A aplicação apresenta a seguinte mensagem:
    A impressora é retomada
    Certifique-se de que a impressora é retomada procurando na pasta Impressoras. Prima Enter na janela da aplicação, para continuar a aplicação.
    Prima ENTER. A aplicação terminar.

Resolução de problemas

A função SetPrinter requer permissões adequadas no Windows XP, Windows 2000, Windows Server 2003 e sistemas baseados em Windows NT. Se não tiver direitos administrativos sobre a impressora especificada, a chamada de função SetPrinter falha.

Referências
Para obter informações adicionais, clique no número de artigo abaixo para visualizar o artigo na Microsoft Knowledge Base:
160129 COMO: Obter o estado de uma impressora e uma tarefa de impressão

Aviso: Este artigo foi traduzido automaticamente

Propriedades

ID do Artigo: 315720 - Última Revisão: 02/02/2016 03:27:00 - Revisão: 4.0

Microsoft Visual C# .NET 2002 Standard Edition, Microsoft Visual C# 2005 Express Edition

  • kbhowtomaster kbmt KB315720 KbMtpt
Comentários