啟用和停用自動執行
在許多情況下,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」 訊息,它不能只傳回 TRUE 或 FALSE。 請改為呼叫 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 檔案,而且不得透過 登錄停用。