FindNextPrinterChangeNotification 函式

FindNextPrinterChangeNotification函式會擷取與印表機或列印伺服器相關聯之變更通知物件的最新變更通知相關資訊。 滿足變更通知物件的等候作業時,請呼叫此函式。

函式也會將變更通知物件重設為未發出訊號的狀態。 然後,您可以在另一個等候作業中使用 物件,繼續監視印表機或列印伺服器。 作業系統會在下次印表機或列印伺服器發生一組指定的變更時,將 物件設定為已發出訊號的狀態。 FindFirstPrinterChangeNotification函式會建立變更通知物件,並指定要監視的變更集。

語法

BOOL FindNextPrinterChangeNotification(
  _In_      HANDLE hChange,
  _Out_opt_ PDWORD pdwChange,
  _In_opt_  LPVOID pPrinterNotifyOptions,
  _Out_opt_ LPVOID *ppPrinterNotifyInfo
);

參數

hChange [in]

與印表機或列印伺服器相關聯的變更通知物件的控制碼。 您可以藉由呼叫 FindFirstPrinterChangeNotification 函式來取得這類控制碼。 當作業系統偵測到物件變更通知篩選中指定的其中一項變更時,作業系統會將此變更通知物件設定為已發出訊號的狀態。

pdwChange [out, optional]

變數的指標,其位設定為表示造成最近通知的變更。 可能設定的位旗標會對應至FindFirstPrinterChangeNotification呼叫之fdwFilter參數中指定的位旗標。 系統會設定下列一或多個位旗標。

意義
PRINTER_CHANGE_ADD_FORM
表單已新增至伺服器。
PRINTER_CHANGE_ADD_JOB
列印工作已傳送至印表機。
PRINTER_CHANGE_ADD_PORT
埠或監視器已新增至伺服器。
PRINTER_CHANGE_ADD_PRINT_PROCESSOR
列印處理器已新增至伺服器。
PRINTER_CHANGE_ADD_PRINTER
印表機已新增至伺服器。
PRINTER_CHANGE_ADD_PRINTER_DRIVER
印表機驅動程式已新增至伺服器。
PRINTER_CHANGE_CONFIGURE_PORT
已在伺服器上設定埠。
PRINTER_CHANGE_DELETE_FORM
表單已從伺服器中刪除。
PRINTER_CHANGE_DELETE_JOB
作業已刪除。
PRINTER_CHANGE_DELETE_PORT
埠或監視器已從伺服器中刪除。
PRINTER_CHANGE_DELETE_PRINT_PROCESSOR
列印處理器已從伺服器中刪除。
PRINTER_CHANGE_DELETE_PRINTER
印表機已刪除。
PRINTER_CHANGE_DELETE_PRINTER_DRIVER
印表機驅動程式已從伺服器中刪除。
PRINTER_CHANGE_FAILED_CONNECTION_PRINTER
印表機連線失敗。
PRINTER_CHANGE_SET_FORM
已在伺服器上設定表單。
PRINTER_CHANGE_SET_JOB
已設定作業。
PRINTER_CHANGE_SET_PRINTER
已設定印表機。
PRINTER_CHANGE_SET_PRINTER_DRIVER
已設定印表機驅動程式。
PRINTER_CHANGE_WRITE_JOB
作業資料已寫入。
PRINTER_CHANGE_TIMEOUT
作業逾時。
PRINTER_CHANGE_SERVER
Windows 7:伺服器上發生變更。

pPrinterNotifyOptions [in, optional]

PRINTER_NOTIFY_OPTIONS結構的指標。 將此結構的 Flags 成員設定為 PRINTER_NOTIFY_OPTIONS_REFRESH,讓函式傳回所有受監視印表機資訊欄位的目前資料。 函式會忽略 結構的所有其他成員。 此參數可以是 Null

ppPrinterNotifyInfo [out, optional]

指標變數的指標,可接收系統組態唯讀緩衝區的指標。 呼叫 FreePrinterNotifyInfo 函 式,以在完成緩衝區時釋放緩衝區。 如果不需要任何資訊,這個參數可以是 Null

緩衝區包含 PRINTER_NOTIFY_INFO 結構,其中包含 PRINTER_NOTIFY_INFO_DATA 結構的陣列。 陣列的每個元素都包含FindFirstPrinterChangeNotification呼叫之 pPrinterNotifyOptions參數中指定的其中一個欄位相關資訊。 一般而言,函式只會提供變更為造成最近通知之欄位的資料。 不過,如果 pPrinterNotifyOptions 參數所指向的結構指定 PRINTER_NOTIFY_OPTIONS_REFRESH,此函式會提供所有受監視欄位的資料。

如果在PRINTER_NOTIFY_INFO結構的Flags成員中設定PRINTER_NOTIFY_INFO_DISCARDED位,則發生溢位或錯誤,而且通知可能已遺失。 在此情況下,除非您進行第二個指定PRINTER_NOTIFY_OPTIONS_REFRESH的 FindNextPrinterChangeNotification呼叫,否則不會傳送其他通知。

傳回值

如果函式成功,則傳回值是非零值。

如果此函式失敗,則傳回值為零。

備註

注意

這是封鎖或同步函式,可能不會立即傳回。 此函式傳回的速度取決於執行時間因素,例如網路狀態、列印伺服器設定,以及撰寫應用程式時難以預測的印表機驅動程式實作因素。 從管理與使用者介面互動的執行緒呼叫此函式,可能會使應用程式看起來沒有回應。

滿足FindFirstPrinterChangeNotification所建立之通知物件的等候作業之後,呼叫FindNextPrinterChangeNotification函式。 呼叫 FindNextPrinterChangeNotification 可讓您取得滿足等候作業之變更的相關資訊,並重設通知物件,以便在下次變更發生時發出訊號。

有一個例外狀況,如果變更通知物件不是處於訊號狀態,請勿呼叫 FindNextPrinterChangeNotification 函式。 如果 wait 函式傳回 值WAIT_TIMEOUT,變更物件就不會處於訊號狀態。 只有在等候函式成功而不逾時時,才呼叫FindNextPrinterChangeNotification函式。例外狀況是呼叫 FindNextPrinterChangeNotification時,pPrinterNotifyOptions參數中設定PRINTER_NOTIFY_OPTIONS_REFRESH位。 請注意,即使設定此旗標,仍可在ppPrinterNotifyInfo參數中設定PRINTER_NOTIFY_INFO_DISCARDED旗標。

若要繼續監視印表機或列印伺服器是否有變更,請重複呼叫其中一個 等候 函式的迴圈,然後呼叫 FindNextPrinterChangeNotification 函式來檢查變更並重設通知物件。

FindNextPrinterChangeNotification 可能會將相同印表機資訊欄位的多個變更合併成單一通知。 發生這種情況時,函式通常會將欄位的所有變更折迭成ppPrinterNotifyInfoPRINTER_NOTIFY_INFO_DATA結構陣列中的單一專案;單一專案只會報告最新的資訊。 不過,對於某些作業和印表機資訊欄位,函式可以傳回相同欄位的多個陣列專案。 在此情況下,欄位的最後一個陣列專案會報告目前的資料,而先前的專案則包含中繼階段的資料。

當您不再需要變更通知物件時,請呼叫 FindClosePrinterChangeNotification 函式加以關閉。

注意

在 Windows XP 的 Service Pack 2 (SP2) 和更新版本中,網際網路連線防火牆 (ICF) 預設會封鎖印表機埠,但可以啟用檔案和列印共用的例外狀況。 如果使用者與另一部電腦建立印表機連線,但未啟用例外狀況,則使用者將不會從伺服器接收印表機變更通知。 電腦系統管理員必須啟用例外狀況。

範例

下列程式碼範例說明如何使用這些函式來監視印表機狀態。

// Get change notification handle for the printer   
chgObject = FindFirstPrinterChangeNotification( 
                hPrinter, 
                PRINTER_CHANGE_JOB, 
                0, 
                NULL); 

if (chgObject != INVALID_HANDLE_VALUE) {
    while (bKeepMonitoring) {
        // Wait for the change notification 
        WaitForSingleObject(chgObject, INFINITE);

        fcnreturn = FindNextPrinterChangeNotification(
                        chgObject, 
                        pdwChange, 
                        NULL, 
                        NULL);

        if (fcnreturn) {
            // Check value of *pdwChange and 
            //  deal with the indicated change 
        }
        // Insert some mechanism to stop monitoring
        //  such as: 
        //
        // if (something happens) {
        //     bKeepMonitoring = false; 
        // }
        //
    }
    // Close Printer Change Notification handle when finished. 
    FindClosePrinterChangeNotification(chgObject);
} else {
    // Unable to open printer change notification handle 
    dwStatus = GetLastError();
}

規格需求

需求
最低支援的用戶端
Windows 2000 專業版 [僅限傳統型應用程式]
最低支援的伺服器
Windows 2000 Server [僅限傳統型應用程式]
標頭
Winspool.h (包含 Windows.h)
程式庫
Winspool.lib
DLL
Spoolss.dll

另請參閱

列印

列印多工緩衝處理器 API 函式

FindClosePrinterChangeNotification

FindFirstPrinterChangeNotification

PRINTER_NOTIFY_INFO

PRINTER_NOTIFY_INFO_DATA

PRINTER_NOTIFY_OPTIONS