共用方式為


IMessageFilter::MessagePending 方法 (objidl.h)

表示 COM 正在等候回應遠端呼叫時,訊息已抵達。

在等候撥出電話完成時處理輸入,可能會造成複雜問題。 應用程式應該判斷是否要處理訊息,而不中斷呼叫、繼續等候或取消作業。

語法

DWORD MessagePending(
  [in] HTASK htaskCallee,
  [in] DWORD dwTickCount,
  [in] DWORD dwPendingType
);

參數

[in] htaskCallee

所呼叫應用程式的線程標識碼。

[in] dwTickCount

自呼叫以來的刻度數目。 它是從 GetTickCount 函式計算而來。

[in] dwPendingType

在收到訊息或事件時進行的呼叫類型。 可能的值為來自列舉 PENDINGTYPE,其中PENDINGTYPE_TOPLEVEL表示傳出呼叫不是巢狀於另一個應用程式的呼叫內,PENDINTGYPE_NESTED表示傳出呼叫是巢狀於另一個應用程式的呼叫內。

傳回值

這個方法可以傳回下列值。

傳回碼 Description
PENDINGMSG_CANCELCALL
取消撥出電話。 這應該只在極端情況下傳回。 取消未回復或遭到拒絕的通話,可能會建立孤立的交易並遺失資源。 COM 會失敗原始呼叫並傳回RPC_E_CALL_CANCELLED。
PENDINGMSG_WAITNOPROCESS
未使用的。
PENDINGMSG_WAITDEFPROCESS
鍵盤和滑鼠訊息不再分派。 不過,在某些情況下,滑鼠和鍵盤訊息可能會導致系統死結,在這些情況下,會捨棄滑鼠和鍵盤訊息。 系統會分派WM_PAINT訊息。 工作切換和啟用訊息的處理方式如下。

備註

COM 會在應用程式進行 COM 方法呼叫之後呼叫 MessagePending ,並在呼叫傳回之前發生 Windows 訊息。 例如,當用戶選取功能表命令或按兩下物件時,會傳送 Windows 訊息。 在 COM 進行 MessagePending 呼叫之前,它會計算自進行原始 COM 方法呼叫以來經過的時間。 COM 會在 dwTickCount 參數中傳遞經過的時間。 同時,COM 不會從佇列中移除訊息。

出現在呼叫端佇列中的 Windows 訊息應該會保留在佇列中,直到經過足夠的時間,以確保訊息可能不是預先輸入的結果,而是嘗試取得注意。 使用 dwTickCount 參數設定延遲 —建議使用兩秒或三秒的延遲。 如果經過該時間量且呼叫尚未完成,則呼叫端應該排清佇列中的訊息,且應該顯示 [OLE UI 忙碌] 對話方塊,讓使用者選擇重試通話, (繼續等候) 或切換至指定的工作。 這可確保下列行為:

  • 如果呼叫在合理的時間內完成,則會正確處理預先輸入。
  • 如果被呼叫者沒有回應,則預先輸入不會被誤譯,而且用戶能夠採取行動來解決問題。 例如,OLE 1 伺服器可以在要求處於強制回應對話框中時,將要求排入佇列,而不需要回應。
在等候撥出電話完成時處理輸入,可能會造成複雜問題。 應用程式應該判斷是否要處理訊息,而不中斷呼叫、繼續等候或取消作業。

當原始 COM 呼叫沒有回應時,應用程式可以取消呼叫,並在其記憶體上呼叫 IStorage::Revert ,將 COM 物件還原為一致的狀態。 當容器可以關閉時,可以釋放 物件。 不過,取消呼叫可能會建立孤立的作業和資源流失。 取消應該只做為最後一個手段。 強烈建議應用程式不允許取消這類呼叫。

注意 雖然 htaskCallee 參數的類型為 HTASK,但它包含所呼叫線程的線程標識碼。 當您實作 IMessageFilter 介面時,您可以呼叫 OpenThread 函式以從 htaskCallee 參數取得線程句柄,而且您可以呼叫 GetProcessIdOfThread 函式以取得進程識別符。
 

規格需求

需求
最低支援的用戶端 Windows 2000 Professional [僅限傳統型應用程式]
最低支援的伺服器 Windows 2000 Server [僅限桌面應用程式]
目標平台 Windows
標頭 objidl.h

另請參閱

IMessageFilter

OleUIBusy