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


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

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

Программное подавление автозапуска

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

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

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

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

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

В следующих фрагментах кода показано, как настроить и обработать это сообщение. Приложение должно выполняться в окне переднего плана. Сначала зарегистрируйте "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 с параметромnIndex, для DWL_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

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

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

Битовое число Константная битовая маска Описание
0x04 DRIVE_REMOVEABLE Диск можно удалить с диска (например, дискеты).
0x08 DRIVE_FIXED Диск не может быть удален из диска (жесткого диска).
0x10 DRIVE_REMOTE Сетевой диск.
0x20 DRIVE_CDROM Дисковод компакт-дисков.
0x40 DRIVE_RAMDISK Диск ОЗУ.

 

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

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

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

Примечание

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

 

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

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