MFC 允许用户自定义应用程序处理键盘和鼠标输入的方式。 用户可以通过向命令分配键盘快捷方式来自定义键盘输入。 用户还可以通过选择在应用程序的特定窗口中双击时应执行的命令来自定义鼠标输入。 本主题介绍如何自定义应用程序的输入。
在 “自定义 ”对话框中,用户可以更改鼠标和键盘的自定义控件。 若要显示此对话框,用户指向“视图”菜单上的“自定义”,然后单击“工具栏”和“停靠”。 在对话框中,用户单击 键盘 选项卡或 鼠标 选项卡。
键盘自定义
下图显示了“自定义”对话框的“键盘”选项卡。
键盘自定义选项卡
用户与键盘选项卡交互,为命令分配一个或多个键盘快捷方式。 可用命令列在选项卡左侧。用户可以从菜单中选择任何可用的命令。 只能将菜单命令与键盘快捷方式相关联。 用户输入新快捷方式后,“ 分配” 按钮将启用。 当用户单击此按钮时,应用程序会将所选命令与该快捷方式相关联。
所有当前分配的键盘快捷方式都列在右侧列的列表框中。 用户还可以选择单个快捷方式并删除它们,或重置应用程序的所有映射。
如果要在应用程序中支持此自定义,则必须创建 CKeyboardManager 对象。 若要创建对象 CKeyboardManager
,请调用函数 CWinAppEx::InitKeyboardManager。 此方法创建并初始化键盘管理器。 如果手动创建键盘管理器,仍必须调用 CWinAppEx::InitKeyboardManager
以初始化它。
如果使用向导创建应用程序,向导将初始化键盘管理器。 应用程序初始化键盘管理器后,框架会将 键盘 选项卡添加到 “自定义 ”对话框。
鼠标自定义
下图显示了“自定义”对话框的“鼠标”选项卡。
鼠标自定义选项卡
用户与此选项卡交互,将菜单命令分配给鼠标双击作。 用户从窗口左侧选择视图,然后使用右侧的控件将命令与双击作相关联。 用户单击 “关闭”后,每当用户双击视图中的任意位置时,应用程序都执行关联的命令。
默认情况下,使用向导创建应用程序时,不会启用鼠标自定义。
启用鼠标自定义
使用 CWinAppEx::GetMouseManager 获取指向鼠标管理器的指针。
使用 CMouseManager::AddView 方法将视图添加到鼠标管理器。 对要添加到鼠标管理器的每个视图执行此作。
应用程序初始化鼠标管理器后,框架会将 “鼠标 ”选项卡添加到“ 自定义 ”对话框。 如果未添加任何视图,则访问选项卡将导致未经处理的异常。 创建视图列表后, 用户可以使用鼠标 选项卡。
向鼠标管理器添加新视图时,会为其提供唯一 ID。 如果要支持窗口的鼠标自定义,则必须处理WM_LBUTTONDBLCLICK消息并调用 CWinAppEx::OnViewDoubleClick 函数。 调用此函数时,其中一个参数是该窗口的 ID。 程序员有责任跟踪 ID 号和与之关联的对象。
安全问题
如 用户定义的工具中所述,用户可以将用户定义的工具 ID 与双击事件相关联。 当用户双击视图时,应用程序将查找与关联 ID 匹配的用户工具。 如果应用程序找到匹配的工具,它将执行该工具。 如果应用程序找不到匹配的工具,则会向双击的视图发送 ID WM_COMMAND 消息。
自定义设置存储在注册表中。 通过编辑注册表,攻击者可以使用任意命令替换有效的用户工具 ID。 当用户双击视图时,视图将处理攻击者所种植的命令。 这可能会导致意外和潜在的危险行为。
此外,此类攻击可以绕过用户界面保护措施。 例如,假设应用程序已禁用打印。 也就是说,在其用户界面中, “打印 ”菜单和按钮不可用。 通常,这可以防止应用程序打印。 但是,如果攻击者编辑了注册表,用户现在可以通过双击视图直接发送打印命令,从而绕过不可用的用户界面元素。
若要防范此类攻击,请将代码添加到应用程序命令处理程序,以在执行命令之前验证该命令是否有效。 不要依赖于用户界面来阻止将命令发送到应用程序。