Share via


啟用和停用自動執行

在許多情況下,AutoRun 可能需要暫時或持續停用。 例如,AutoRun 可能會干擾執行中應用程式的作業,而且必須在持續時間內停用。 系統提供數種方式來停用 AutoRun。

以程式設計方式隱藏自動執行

在某些情況下,可能需要以程式設計方式隱藏 AutoRun。 以下為兩個範例:

  • 您的應用程式具有安裝程式,要求使用者插入另一個可能包含 Autorun.inf 檔案的光碟。
  • 在應用程式的作業期間,使用者可能需要插入另一個可能包含 Autorun.inf 檔案的光碟。

不論是哪一種情況,您通常都不想在原始應用程式進行時啟動另一個應用程式。

使用者可以在插入 CD-ROM 時按住 SHIFT 鍵來手動隱藏 AutoRun。 不過,通常最好以程式設計方式處理此作業,而不是視使用者而定。

使用 Shell 4.70 版和更新版本的系統,Windows 會將 「QueryCancelAutoPlay」 訊息傳送至前景視窗。 您的應用程式可以回應此訊息來隱藏 AutoRun。 系統公用程式會使用此方法,例如 [開啟 一般] 對話方塊來停用 AutoRun。

下列程式碼片段說明如何設定及處理此訊息。 您的應用程式必須在前景視窗中執行。 首先,將 「QueryCancelAutoPlay」 註冊為 Windows 訊息:

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

您的應用程式視窗必須位於前景,才能接收此訊息。 訊息處理常式應該會傳回 TRUE 以取消 AutoRun 和 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 以取消 AutoRun,並將 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 的第一個位元組中設定,以停用特定磁片磁碟機類型的 AutoRun。 您必須重新開機 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 通常很有用。 此功能通常用來簡化 AutoRun.inf 檔案的偵錯。 符合下列準則時,AutoRun 僅適用于抽取式儲存裝置:

  • 裝置必須有自動執行相容的驅動程式。 若要與自動執行相容,驅動程式必須傳送 WM_DEVICECHANGE 訊息,通知系統已插入磁片。
  • 插入媒體的根目錄必須包含 Autorun.inf 檔案。
  • 裝置不得透過登錄停用 AutoRun
  • 前景應用程式尚未 隱藏 AutoRun。

注意

此功能不應該用來在卸載式媒體上散發應用程式。 由於在卸載式媒體上實作 AutoRun 可讓您輕鬆散佈電腦病毒,因此使用者應該對包含 Autorun.inf 檔案的任何公開分散式磁片可疑。

 

一般而言,AutoRun 會自動啟動,但也可以手動啟動。 如果裝置符合上述準則,磁碟機號的快捷方式功能表將會包含 自動播放 命令。 若要手動執行 AutoRun,請以滑鼠右鍵按一下磁片磁碟機圖示,然後從快捷方式功能表選取 [ 自動播放 ],或按兩下磁片磁碟機圖示。 如果驅動程式與自動執行不相容,快捷方式功能表將不會有 自動播放 專案,而且無法啟動自動執行。

自動執行相容的驅動程式隨附于一些卸載式磁片磁碟機,以及一些其他類型的卸載式媒體,例如 CompactFlash 卡片。 AutoRun 也適用于對應至 Windows 檔案總管磁碟機號的網路磁碟機機,或掛接 Microsoft Management Console (MMC) 。 如同掛接的硬體,掛接的網路磁碟機在其根目錄中必須有 Autorun.inf 檔案,而且不得透過 登錄停用。