共用方式為


鍵盤和滑鼠自訂

MFC 可讓應用程式的使用者自訂處理鍵盤和滑鼠輸入的方式。 使用者可以藉由指派命令的鍵盤快速鍵自訂鍵盤輸入。 使用者也可以選取在特定應用程式視窗中按兩下時應執行的命令,藉此自訂滑鼠輸入。 本主題將說明如何自訂應用程式的輸入。

在 [ 自訂 ] 對話方塊中,使用者可以變更滑鼠和鍵盤的自訂控制項。 若要顯示此對話方塊,使用者指向 [檢視 ] 功能表上的 [ 自訂 ],然後按一下 [工具列] 和 [ 停駐 ]。 在對話方塊中,使用者按一下 [鍵盤 ] 索引標籤或 [滑鼠] 索引 標籤。

鍵盤自訂

下圖顯示 [自訂 ] 對話方塊的 [鍵盤 ] 索引標籤。

Keyboard tab in the Customize dialog box.
鍵盤自訂索引標籤

使用者可與 [鍵盤] 索引標籤互動,將一個或多個鍵盤快速鍵指派給命令。 可用的命令會列在索引標籤的左側。使用者可以從功能表中選取任何可用的命令。 但是只有功能表命令可以與鍵盤快速鍵相關聯。 使用者輸入新的快捷方式之後,[ 指派 ] 按鈕就會變成啟用。 當使用者按一下這個按鈕時,應用程式就會將選取的命令與該捷徑產生關聯。

所有目前指派的鍵盤快速鍵都會在右欄的清單方塊中列出。 使用者也可以選取個別快速鍵並將它們移除,或是重設應用程式的所有對應。

如果您想要在應用程式中支援此自訂,您必須建立 CKeyboardManager 物件。 若要建立 CKeyboardManager 物件,請呼叫函式 CWinAppEx::InitKeyboardManager 。 這個方法會建立並初始化鍵盤管理員。 即使您手動建立鍵盤管理員,仍然必須呼叫 CWinAppEx::InitKeyboardManager 將它初始化。

如果您使用精靈來建立應用程式,精靈將會初始化鍵盤管理員。 應用程式初始化鍵盤管理員之後,架構會將 [鍵盤 ] 索引標籤新增 至 [ 自訂 ] 對話方塊。

滑鼠自訂

下圖顯示 [自訂 ] 對話方塊的 [滑鼠 ] 索引標籤。

Mouse tab in the Customize dialog box.
滑鼠自訂索引標籤

使用者可與這個索引標籤互動,以指派按兩下滑鼠動作的功能表命令。 使用者從視窗左側選取一個檢視,然後使用右側的控制項將命令與按兩下動作產生關聯。 當使用者按一下 [ 關閉 ] 之後,每當使用者按兩下檢視中的任何位置時,應用程式就會執行相關聯的命令。

根據預設,當您使用精靈建立應用程式時,滑鼠自訂不會啟用。

啟用滑鼠自訂

  1. 呼叫 CWinAppEx::InitMouseManager,初始化 CMouseManager 物件。

  2. 使用 CWinAppEx::GetMouseManager 取得滑鼠管理員的指標。

  3. 使用 CMouseManager::AddView 方法,將檢視新增至滑鼠管理員。 針對您要加入至滑鼠管理員的每個檢視執行這項作業。

應用程式初始化滑鼠管理員之後,架構會將 [滑鼠 ] 索引標籤新增 至 [ 自訂 ] 對話方塊。 如果您未加入任何檢視,則存取這個索引標籤將會產生未處理的例外狀況。 建立檢視清單之後, 使用者可以使用滑鼠 索引標籤。

當您將新的檢視加入至滑鼠管理員時,會指定該檢視的唯一 ID。 如果您想要支援視窗的滑鼠自訂,您必須處理WM_LBUTTONDBLCLICK訊息,並呼叫 CWinAppEx::OnViewDoubleClick 函式。 當您呼叫這個函式時,其中一個參數會是該視窗的 ID。 程式設計人員必須責任追蹤 ID 編號以及與其相關聯的物件。

安全性考量

如使用者定義工具 中所述 ,使用者可以將使用者定義的工具識別碼與按兩下事件產生關聯。 當使用者按兩下檢視時,應用程式會尋找符合相關聯 ID 的使用者工具。 如果應用程式找到相符的工具,就會執行該工具。 如果應用程式找不到符合的工具,則會傳送包含該 ID 的 WM_COMMAND 訊息至按兩下的檢視。

自訂的設定會儲存在登錄中。 透過編輯登錄,攻擊者就可以用任意命令取代有效的使用者工具 ID。 當使用者按兩下檢視時,檢視就會處理攻擊者植入的命令。 這樣可能會造成無法預期且具有潛在危險性的行為。

此外,這種攻擊可能會避開使用者介面的保護。 例如,假設應用程式已停用列印。 也就是說,在其使用者介面中, [列印 ] 功能表和按鈕無法使用。 通常這樣會防止應用程式進行列印。 但是,如果攻擊者編輯登錄,使用者就可以直接透過按兩下檢視的方式傳送列印命令,而避開無法使用的使用者介面項目。

為了防範這種攻擊,在執行命令之前,請在應用程式命令處理常式中加入程式碼以驗證命令是否有效。 不要倚賴使用者介面阻止命令傳送至應用程式。

另請參閱

MFC 自訂
CKeyboardManager 類別
CMouseManager 類別
自訂的安全性影響