启用和禁用自动运行

在许多情况下,可能需要暂时或永久禁用 AutoRun。 例如,AutoRun 可能会干扰正在运行的应用程序的操作,需要在持续时间内禁用。 系统提供了多种禁用自动运行的方法。

以编程方式取消自动运行

在多种情况下,可能需要以编程方式取消自动运行。 两个示例包括:

  • 应用程序有一个安装程序,要求用户插入另一张可能包含 Autorun.inf 文件的光盘。
  • 在应用程序操作期间,用户可能需要插入另一张可能包含 Autorun.inf 文件的光盘。

在任一情况下,在原始应用程序正在进行时,通常都不希望启动另一个应用程序。

用户可以在插入 CD-ROM 时通过按住 SHIFT 键来手动取消自动运行。 但是,通常最好以编程方式处理此操作,而不是取决于用户。

对于具有 Shell 版本 4.70 及更高版本的系统,Windows 会向前台窗口发送“QueryCancelAutoPlay”消息。 应用程序可以响应此消息以取消自动运行。 此方法由系统实用工具(如 “打开 公共”对话框)用于禁用自动运行。

以下代码片段演示如何设置和处理此消息。 应用程序必须在前台窗口中运行。 首先,将“QueryCancelAutoPlay”注册为 Windows 消息:

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

应用程序的窗口必须位于前台才能接收此消息。 消息处理程序应返回 TRUE 以取消自动运行,并返回 FALSE 以启用它。 以下代码片段演示了如何使用此消息禁用 AutoRun。

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”消息,则它不能仅返回 TRUEFALSE。 请改为调用 SetWindowLong ,将 nIndex 设置为 DWL_MSGRESULT。 将 dwNewLong 参数设置为 TRUE 可取消自动运行,将 FALSE 设置为启用它。 例如,以下示例对话框过程在收到“QueryCancelAutoPlay”消息时取消 AutoRun。

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

使用注册表禁用自动运行

有两个注册表值可用于永久禁用 AutoRun:NoDriveAutoRun 和 NoDriveTypeAutoRun。 第一个值对指定的驱动器号禁用 AutoRun,第二个值对一类驱动器禁用 AutoRun。 如果将这两个值中的任何一个设置为对特定设备禁用 AutoRun,则将禁用它。

注意

NoDriveAutoRun 和 NoDriveTypeAutoRun 值只能由系统管理员修改,以更改整个系统的值,以便进行测试或管理。 应用程序不应修改这些值,因为无法可靠地将它们还原为其原始值。

 

NoDriveAutoRun 值对指定的驱动器号禁用 AutoRun。 它是REG_DWORD数据值,位于以下键下:

HKEY_CURRENT_USER
   Software
      Microsoft
         Windows
            CurrentVersion
               Policies
                  Explorer

值的第一个位对应于驱动器 A:,第二位对应于 B:,依此推。 若要对一个或多个驱动器号禁用 AutoRun,请设置相应的位。 例如,若要禁用 A: 和 C: 驱动器,请将 NoDriveAutoRun 设置为 0x00000005

NoDriveTypeAutoRun 值禁用某类驱动器的 AutoRun。 它是REG_DWORD或 4 字节REG_BINARY数据值,位于同一键下。

HKEY_CURRENT_USER
   Software
      Microsoft
         Windows
            CurrentVersion
               Policies
                  Explorer

通过设置此值第一个字节的位,可以将不同的驱动器排除在使用 AutoRun 之外。

下表提供了位和位掩码常量,可以在 NoDriveTypeAutoRun 的第一个字节中设置这些常量,以禁用特定驱动器类型的自动运行。 必须在更改生效之前重启 Windows 资源管理器。

位号 位掩码常量 说明
0x04 DRIVE_REMOVEABLE 可以从驱动器中删除磁盘 (,例如软盘) 。
0x08 DRIVE_FIXED 无法从硬盘) (驱动器中删除磁盘。
0x10 DRIVE_REMOTE 网络驱动器。
0x20 DRIVE_CDROM CD-ROM 驱动器。
0x40 DRIVE_RAMDISK RAM 磁盘。

 

针对其他类型的存储媒体自动运行

AutoRun 主要用于在 CD-ROM 和 DVD-ROM 上公开分发应用程序,不建议将其用于其他存储介质。 但是,在其他类型的可移动存储媒体上启用自动运行通常很有用。 此功能通常用于简化 AutoRun.inf 文件的调试。 当满足以下条件时,AutoRun 仅适用于可移动存储设备:

  • 设备必须具有与 AutoRun 兼容的驱动程序。 若要与 AutoRun 兼容,驱动程序必须通过发送WM_DEVICECHANGE消息来通知系统已插入 磁盘
  • 插入媒体的根目录必须包含 Autorun.inf 文件。
  • 设备不得通过 注册表禁用 AutoRun。
  • 前台应用程序未 禁止自动 运行。

注意

此功能不应用于在可移动媒体上分发应用程序。 由于在可移动媒体上实现 AutoRun 提供了一种传播计算机病毒的简单方法,因此用户应怀疑任何公开分发的软盘包含 Autorun.inf 文件。

 

通常,自动运行会自动启动,但也可以手动启动。 如果设备满足上面列出的条件,驱动器号的快捷菜单将包含 “自动播放” 命令。 若要手动运行自动运行,请右键单击驱动器图标,然后从快捷菜单中选择“ 自动播放 ”,或双击驱动器图标。 如果驱动程序与 AutoRun 不兼容,则快捷菜单将没有 “自动播放 ”项,并且无法启动“自动运行”。

AutoRun 兼容的驱动程序随一些可移动磁盘驱动器以及一些其他类型的可移动媒体(如 CompactFlash 卡)一起提供。 AutoRun 还适用于使用 Windows 资源管理器映射到驱动器号的网络驱动器,或者使用 Microsoft 管理控制台 (MMC) 装载的网络驱动器。 与装载的硬件一样,装载的网络驱动器必须在其根目录中具有 Autorun.inf 文件,并且不能通过 注册表禁用。