Compartilhar via


Habilitar e desabilitar a execução automática

Há muitas situações em que a Execução Automática pode precisar ser temporariamente ou persistentemente desabilitada. Por exemplo, a Execução Automática pode interferir na operação de um aplicativo em execução e precisa ser desabilitada durante a duração. O sistema fornece várias maneiras de desabilitar a Execução Automática.

Suprimir a execução automática programaticamente

Há uma variedade de situações em que a Execução Automática pode precisar ser suprimida programaticamente. Dois exemplos são:

  • Seu aplicativo tem um programa de instalação que exige que o usuário insira outro disco que possa conter um arquivo Autorun.inf.
  • Durante a operação do aplicativo, talvez o usuário precise inserir outro disco que possa conter um arquivo Autorun.inf.

Em ambos os casos, normalmente você não desejará iniciar outro aplicativo enquanto o original estiver em andamento.

Os usuários podem suprimir manualmente a Execução Automática mantendo pressionada a tecla SHIFT quando inserem o CD-ROM. No entanto, geralmente é preferível lidar com essa operação programaticamente em vez de depender do usuário.

Com sistemas que têm o Shell versão 4.70 e posterior, o Windows envia uma mensagem "QueryCancelAutoPlay" para a janela em primeiro plano. Seu aplicativo pode responder a essa mensagem para suprimir a Execução Automática. Essa abordagem é usada por utilitários do sistema, como a caixa de diálogo Abrir comum para desabilitar a Execução Automática.

Os fragmentos de código a seguir ilustram como configurar e lidar com essa mensagem. Seu aplicativo deve estar em execução na janela em primeiro plano. Primeiro, registre "QueryCancelAutoPlay" como uma mensagem do Windows:

uMessage = RegisterWindowMessage(TEXT("QueryCancelAutoPlay"));

A janela do aplicativo deve estar em primeiro plano para receber essa mensagem. O manipulador de mensagens deve retornar TRUE para cancelar a Execução Automática e FALSE para habilitá-la. O fragmento de código a seguir ilustra como usar essa mensagem para desabilitar a Execução Automática.

UINT g_uQueryCancelAutoPlay = 0;

LRESULT WndProc(HWND hwnd, UINT uMsg,  WPARAM wParam, LPARAM lParam) 
{ 
    switch (uMsg) 
    { 
    ... 
    default: 
        if (!g_uQueryCancelAutoPlay)
        { 
            g_uQueryCancelAutoPlay = RegisterWindowMessage(TEXT("QueryCancelAutoPlay"));
        } 
        if (uMsg && uMsg == g_uQueryCancelAutoPlay)
        { 
            return TRUE;       // Cancel AutoRun
        }
    }
}

Se o aplicativo estiver usando uma caixa de diálogo e precisar responder a uma mensagem "QueryCancelAutoPlay", ele não poderá simplesmente retornar TRUE ou FALSE. Em vez disso, chame SetWindowLong com nIndex definido como DWL_MSGRESULT. Defina o parâmetro dwNewLong comoTRUE para cancelar a Execução Automática e FALSE para habilitá-lo. Por exemplo, o procedimento da caixa de diálogo de exemplo a seguir cancela a Execução Automática quando recebe uma mensagem "QueryCancelAutoPlay".

UINT g_uQueryCancelAutoPlay = 0;

BOOL DialogProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) 
{ 
    switch (uMsg) 
    { 
    ...
    default: 
        if (!g_uQueryCancelAutoPlay)
        {
            g_uQueryCancelAutoPlay = RegisterWindowMessage(TEXT("QueryCancelAutoPlay"));
        } 
        if (uMsg == g_uQueryCancelAutoPlay) 
        {
            SetWindowLong(hDlg, DWL_MSGRESULT, TRUE);          
            return 1;               
        }
    } 

Usando o Registro para desabilitar a Execução Automática

Há dois valores do Registro que podem ser usados para desabilitar persistentemente a Execução Automática: NoDriveAutoRun e NoDriveTypeAutoRun. O primeiro valor desabilita AutoRun para letras de unidade especificadas e o segundo desabilita a Execução Automática para uma classe de unidades. Se um desses valores estiver definido para desabilitar a Execução Automática para um dispositivo específico, ele será desabilitado.

Observação

Os valores NoDriveAutoRun e NoDriveTypeAutoRun só devem ser modificados pelos administradores do sistema para alterar o valor de todo o sistema para fins administrativos ou de teste. Os aplicativos não devem modificar esses valores, pois não há como restaurá-los de forma confiável para seus valores originais.

 

O valor NoDriveAutoRun desabilita AutoRun para letras de unidade especificadas. É um valor de dados REG_DWORD, encontrado na seguinte chave:

HKEY_CURRENT_USER
   Software
      Microsoft
         Windows
            CurrentVersion
               Policies
                  Explorer

O primeiro bit do valor corresponde à unidade A:, a segunda a B:, e assim por diante. Para desabilitar a Execução Automática para uma ou mais letras de unidade, defina os bits correspondentes. Por exemplo, para desabilitar as unidades A: e C: , defina NoDriveAutoRun como 0x00000005.

O valor NoDriveTypeAutoRun desabilita AutoRun para uma classe de unidades. É um valor de dados REG_DWORD ou de 4 bytes REG_BINARY, encontrado sob a mesma chave.

HKEY_CURRENT_USER
   Software
      Microsoft
         Windows
            CurrentVersion
               Policies
                  Explorer

Ao definir os bits do primeiro byte desse valor, diferentes unidades podem ser excluídas de trabalhar com AutoRun.

A tabela a seguir fornece as constantes bits e bitmask, que podem ser definidas no primeiro byte de NoDriveTypeAutoRun para desabilitar a Execução Automática para um tipo de unidade específico. Você deve reiniciar o Windows Explorer antes que as alterações entrem em vigor.

Número do Bit Constante bitmask Descrição
0x04 DRIVE_REMOVEABLE O disco pode ser removido da unidade (como um disquete).
0x08 DRIVE_FIXED O disco não pode ser removido da unidade (um disco rígido).
0x10 DRIVE_REMOTE Unidade de rede.
0x20 DRIVE_CDROM Unidade de CD-ROM.
0x40 DRIVE_RAMDISK Disco de RAM.

 

Executar automaticamente para outros tipos de mídia de armazenamento

A Execução Automática destina-se principalmente à distribuição pública de aplicativos em CD-ROM e DVD-ROM, e seu uso é desencorajado para outras mídias de armazenamento. No entanto, geralmente é útil habilitar a Execução Automática em outros tipos de mídia de armazenamento removível. Normalmente, esse recurso é usado para simplificar a depuração de arquivos AutoRun.inf. A Execução Automática só funciona em dispositivos de armazenamento removíveis quando os seguintes critérios são atendidos:

  • O dispositivo deve ter drivers compatíveis com AutoRun. Para ser compatível com AutoRun, um driver deve notificar o sistema de que um disco foi inserido enviando uma mensagem WM_DEVICECHANGE .
  • O diretório raiz da mídia inserida deve conter um arquivo Autorun.inf.
  • O dispositivo não deve ter a Execução Automática desabilitada por meio do registro.
  • O aplicativo em primeiro plano não suprimiu a Execução Automática.

Observação

Esse recurso não deve ser usado para distribuir aplicativos em mídia removível. Como a implementação da Execução Automática em mídia removível fornece uma maneira fácil de espalhar vírus do computador, os usuários devem suspeitar de qualquer disquete distribuído publicamente que contenha um arquivo Autorun.inf.

 

Normalmente, a Execução Automática é iniciada automaticamente, mas também pode ser iniciada manualmente. Se o dispositivo atender aos critérios listados acima, o menu de atalho da letra da unidade incluirá um comando AutoPlay . Para executar a Execução Automática manualmente, clique com o botão direito do mouse no ícone da unidade e selecione Reprodução Automática no menu de atalho ou clique duas vezes no ícone da unidade. Se os drivers não forem compatíveis com AutoRun, o menu de atalho não terá um item de Reprodução Automática e a Execução Automática não poderá ser iniciada.

Drivers compatíveis com AutoRun são fornecidos com algumas unidades de disco removíveis, bem como alguns outros tipos de mídia removível, como cartões CompactFlash. A Execução Automática também funciona com unidades de rede mapeadas para uma letra de unidade com o Windows Explorer ou montadas com o Console de Gerenciamento da Microsoft (MMC). Assim como acontece com o hardware montado, uma unidade de rede montada deve ter um arquivo Autorun.inf em seu diretório raiz e não deve ser desabilitada por meio do Registro.