共用方式為


服務觸發程式事件

當觸發程式事件發生時,服務可以註冊以啟動或停止。 這可避免服務在系統啟動時啟動,或服務輪詢或主動等候事件的需求;服務可以在需要時啟動,而不是自動啟動是否要執行的工作。 預先定義的觸發程式事件的範例包括抵達指定裝置介面類別別的裝置,或特定防火牆埠的可用性。 服務也可以註冊 Windows 事件追蹤 (ETW) 提供者所產生的自訂觸發程式事件。

Windows Server 2008、Windows Vista、Windows Server 2003 和 Windows XP: 在 Windows Server 2008 R2 和 Windows 7 之前,不支援服務觸發程式事件。

觸發程式是由觸發程式事件類型、觸發程式事件子類型、回應觸發程式事件所採取的動作,以及特定觸發程式事件類型的 () 一或多個觸發程式特定資料項目。 子類型和觸發程式特定的資料項目會同時指定通知事件服務的條件。 資料項目的格式取決於觸發程式事件類型;資料項目可以是二進位資料、字串或多字串。 字串必須是 Unicode;不支援 ANSI 字串。

為了註冊觸發程式事件,服務會使用SERVICE_CONFIG_TRIGGER_INFO呼叫ChangeServiceConfig2,並提供SERVICE_TRIGGER_INFO結構。 SERVICE_TRIGGER_INFO結構指向SERVICE_TRIGGER結構的陣列,每個都指定一個觸發程式。

如果在系統啟動時觸發條件為 true,或當系統執行時觸發條件變成 true,就會採取指定的觸發程式動作。 例如,如果服務註冊在特定裝置可用時啟動,當系統啟動時,如果裝置已經插入電腦,就會啟動服務;如果使用者在執行系統時插入裝置,就會啟動服務。

如果觸發程式具有觸發程式特定的資料項目,則只有在觸發程式事件隨附的資料項目符合觸發程式所指定服務的其中一個資料項目時,才會採取觸發程式動作。 二進位資料比對是透過位比較來完成。 字串比對不區分大小寫。 如果資料項目是多字串,則 multistring 中的所有字串都必須相符。

當服務啟動以回應觸發程式事件時,服務會在其ServiceMain回呼函式中收到SERVICE_TRIGGER_STARTED_ARGUMENTargv[1]。 Argv[0] 一律是服務的簡短名稱。

註冊以回應觸發程式事件的服務,可能會在服務沒有工作時停止閒置逾時後自行停止。 停止本身的服務必須準備好處理 SERVICE_CONTROL_TRIGGEREVENT 在服務停止時抵達的要求。 每當服務處於執行中狀態時發生新的觸發程式事件時,SCM 就會傳送 SERVICE_CONTROL_TRIGGEREVENT 控制要求。 為了避免遺失觸發程式事件,服務 應該傳回 ERROR_SHUTDOWN_IN_PROGRESS,以供服務從執行中轉換至停止時抵達的任何 SERVICE_CONTROL_TRIGGEREVENT 控制要求。 這會指示 SCM 將觸發事件排入佇列,並等候服務進入停止狀態。 SCM 接著會採取與佇列觸發程式事件相關聯的動作,例如啟動服務。

當服務準備好再次處理觸發程式事件時,它會在呼叫SetServiceStatus的控制項接受遮罩中設定SERVICE_ACCEPT_TRIGGEREVENT。 這通常是在服務使用SERVICE_RUNNING呼叫SetServiceStatus時完成。 SCM 接著會針對每個已排入佇列的觸發程式事件發出 SERVICE_CONTROL_TRIGGEREVENT 要求,直到佇列是空的為止。

無法停止執行相依服務的服務,以回應觸發程式事件。

在記憶體不足的情況下,不保證觸發程式啟動和觸發程式停止要求。

使用 QueryServiceConfig2 函式來擷取服務的觸發程式事件組態。

SC 工具 (sc.exe) 可用來在命令提示字元設定或查詢服務的觸發程式事件。 使用 triggerinfo 選項來設定服務以啟動或停止以回應觸發程式事件。 使用 qtriggerinfo 選項來查詢服務的觸發程式組態。

下列範例會查詢 W32time 服務的觸發程式組態,其設定為在電腦加入網域時啟動,並在電腦離開網域時停止。

C:\>sc qtriggerinfo w32time
[SC] QueryServiceConfig2 SUCCESS

SERVICE_NAME: w32time

        START SERVICE
          DOMAIN JOINED STATUS         : 1ce20aba-9851-4421-9430-1ddeb766e809 [DOMAIN JOINED]
        STOP SERVICE
          DOMAIN JOINED STATUS         : ddaf516e-58c2-4866-9574-c3b615d42ea1 [NOT DOMAIN JOINED]

下列範例會查詢平板電腦輸入服務的觸發程式設定,此設定為在 GUID {4d1e55b2-f16f-11cf-88cb-001111000030} 和任何指定的 HID 裝置識別碼送達時啟動。

C:\>sc qtriggerinfo tabletinputservice
[SC] QueryServiceConfig2 SUCCESS

SERVICE_NAME: tabletinputservice

        START SERVICE
          DEVICE INTERFACE ARRIVAL     : 4d1e55b2-f16f-11cf-88cb-001111000030 [INTERFACE CLASS GUID]
            DATA                       : HID_DEVICE_UP:000D_U:0001
            DATA                       : HID_DEVICE_UP:000D_U:0002
            DATA                       : HID_DEVICE_UP:000D_U:0003
            DATA                       : HID_DEVICE_UP:000D_U:0004