Поделиться через


Включение и отключение автоматического запуска

Существует множество ситуаций, когда автозапуск может потребоваться временно или постоянно отключить. Например, автозапуск может препятствовать работе запущенного приложения и его необходимо отключить в течение длительности. Система предоставляет несколько способов отключения автозапуска.

Отключение автоматического запуска программным способом

Существует множество ситуаций, когда автозапуск может потребоваться подавить программным путем. Ниже приведены два примера.

  • Приложение имеет программу установки, требующую от пользователя вставлять другой диск, который может содержать файл Autorun.inf.
  • Во время работы приложения пользователю может потребоваться вставить другой диск, который может содержать файл Autorun.inf.

В любом случае вы обычно не хотите запускать другое приложение во время выполнения исходного приложения.

Пользователи могут вручную отключить автозапуск, удерживая клавишу SHIFT при вставке компакт-диска. Однако обычно предпочтительнее обрабатывать эту операцию программным способом, а не в зависимости от пользователя.

В системах с оболочкой версии 4.70 и более поздних версиях Windows отправляет сообщение QueryCancelAutoPlay в окно переднего плана. Приложение может ответить на это сообщение, чтобы отключить автозапуск. Этот подход используется системными служебными программами, такими как стандартное диалоговое окно Open для отключения автоматического запуска.

В следующих фрагментах кода показано, как настроить и обработать это сообщение. Приложение должно работать в окне переднего плана. Сначала зарегистрируйте "QueryCancelAutoPlay" в качестве сообщения Windows:

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

Окно приложения должно находиться на переднем плане, чтобы получить это сообщение. Обработчик сообщений должен вернуть TRUE, чтобы отменить автозапуск и FALSE, чтобы включить его. В следующем фрагменте кода показано, как использовать это сообщение для отключения автоматического запуска.

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
        }
    }
}

Если приложение использует диалоговое окно и должно отвечать на сообщение QueryCancelAutoPlay, оно не может просто вернуть TRUE или FALSE. Вместо этого вызовите SetWindowLong с nIndexDWL_MSGRESULT. Задайте параметру dwNewLong значение TRUE для отмены автоматического запуска и false, чтобы включить его. Например, следующая процедура диалогового окна отменяет автозапуск при получении сообщения 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;               
        }
    } 

Использование реестра для отключения автоматического запуска

Существует два значения реестра, которые можно использовать для постоянного отключения автозапуска: NoDriveAutoRun и NoDriveTypeAutoRun. Первое значение отключает Автозапуск для указанных букв дисков, а второе — Автозапуск для типов дисков. Если для одного из этих значений установлено отключение автоматического запуска для определенного устройства, он будет отключен.

Заметка

Значения NoDriveAutoRun и NoDriveTypeAutoRun должны изменяться только системными администраторами, чтобы изменить значение всей системы для тестирования или администрирования. Приложения не должны изменять эти значения, так как их надежное восстановление до исходных значений невозможно.

 

Значение NoDriveAutoRun отключает автозапуск для указанных букв диска. Это значение данных типа REG_DWORD, найденное в следующем разделе:

HKEY_CURRENT_USER
   Software
      Microsoft
         Windows
            CurrentVersion
               Policies
                  Explorer

Первый бит значения соответствует диску A:, второму — B:, и т. д. Чтобы отключить автозапуск для одного или нескольких букв диска, задайте соответствующие биты. Например, чтобы отключить диски A и C, задайте для NoDriveAutoRun значение 0x00000005.

Значение NoDriveTypeAutoRun отключает автозапуск для типов дисков. Это значение REG_DWORD или 4-байтовое значение REG_BINARY, которое находится под тем же ключом.

HKEY_CURRENT_USER
   Software
      Microsoft
         Windows
            CurrentVersion
               Policies
                  Explorer

Задав биты первого байта этого значения, различные диски можно исключить из работы с autoRun.

В следующей таблице приведены биты и константы битовой маски, которые можно задать в первом байте NoDriveTypeAutoRun, чтобы отключить autoRun для определенного типа диска. Прежде чем изменения вступили в силу, необходимо перезапустить проводник Windows.

Битовое число Константная битовая маска Описание
0x04 УСТРОЙСТВО_СЪЕМНОЕ Диск можно извлечь из привода (например, дискету).
0x08 ФИКСИРОВАННЫЙ ДИСК Диск нельзя удалить с диска (жесткого диска).
0x10 DRIVE_REMOTE Сетевой диск.
0x20 DRIVE_CDROM диск CD-ROM
0x40 DRIVE_RAMDISK Диск ОЗУ.

 

Автозапуск для других типов носителей информации

Автозапуск в основном предназначен для общедоступного распространения приложений на CD-ROM и DVD-ROM, а его использование не рекомендуется для других носителей хранения. Однако часто рекомендуется включить автозапуск на других типах съемных носителей. Эта функция обычно используется для упрощения отладки файлов AutoRun.inf. AutoRun работает только на съемных устройствах хранения, если выполнены следующие условия:

  • Устройство должно иметь драйверы, совместимые с autoRun. Чтобы быть совместимым с автозапуском, драйвер должен уведомить систему о том, что диск был вставлен, отправив WM_DEVICECHANGE сообщение.
  • Корневой каталог вставленного носителя должен содержать файл Autorun.inf.
  • Устройство не должно иметь отключённую функцию AutoRun через реестр .
  • Приложение переднего плана не подавлено автозапуска.

Заметка

Эта функция не должна использоваться для распространения приложений на съемных носителях. Поскольку реализация AutoRun на съемных носителях обеспечивает простой способ распространения компьютерных вирусов, пользователи должны подозревать любую публично распространяемую дискету, содержащую файл Autorun.inf.

 

Как правило, автозапуск запускается автоматически, но его также можно запустить вручную. Если устройство соответствует указанным выше условиям, контекстное меню буквы диска будет включать команду автозапуска. Чтобы запустить автозапуск вручную, щелкните правой кнопкой мыши значок диска и выберите Автозапуск в контекстном меню или дважды щелкните значок диска. Если драйверы не совместимы с автозапуском, контекстное меню не будет иметь элемент автозапуска и автозапуск не может быть запущен.

Драйверы, совместимые с автозапуском, предоставляются с некоторыми съемными дисками, а также некоторыми другими типами съемных носителей, таких как карточки CompactFlash. AutoRun также работает с сетевыми дисками, сопоставленными с буквой диска с проводником Windows или подключенными к консоли управления Майкрософт (MMC). Как и в подключенном оборудовании, подключенный сетевой диск должен иметь файл Autorun.inf в корневом каталоге и не должен быть отключен с помощью реестра.