无法在鼠标事件处理程序中读取 WPF 中密钥的保持状态 - VMWare Fusion for Mac 上的 Windo



此问题是由 vmware fusion 中的设置不一致引起的 - MacOS 的辅助鼠标功能(即右键单击)是由控制左键单击触发的,尽管在 vmware fusion 设置中配置为将控制权作为单独的键发送。

我把它留在这里,因为它概述了为隔离问题而采取的诊断步骤。

此行为可能存在于 MacOS 上的其他虚拟化解决方案中。

这不是重复的 - 我已经尝试了建议的方法 - 它们不起作用。请提供真正的帮助。

我正在尝试在 WPF 画布中实现多选功能,并且需要能够在单击项目时检测何时按住任一控制键。

我已经尝试使用记录在案和接受的方法来获取密钥(Keyboard.IsKeyDownKeyboard.Modifiers),尽管它们应该有效,但在这种情况下它们不起作用。

我无法在应用程序的主窗口中放置密钥处理程序,因为此解决方案是在组件中实现的,因此,我无法访问主窗口。

我无法创建键盘OnKeyDown覆盖,因为它不会注册事件。我不知道为什么会这样,但可以说,在对 Stack Overflow 进行广泛搜索后,我已经尝试了我能找到的所有方法,目前没有想法。

在当前逻辑中,单击画布中的项目将清除所有选定的项目。如果按住控制键,我不会清除所选项目。

我的应用程序结构如下:

主窗口 -> 停靠面板 -> 滚动查看器 -> 主自定义组件(扩展Canvas) -> ChildCanvas 对象(多个实例,所有实例也扩展Canvas)。

该组件不会有任何对主窗口的引用 - 这绝对是不可协商的。

组件不得要求将主窗口的引用传递给它。

组件不能依赖于放置在MainWindow中的任何逻辑、属性、方法或其他功能代码 - 它必须是完全可重用的。

自定义对象 (ChildCanvas) 的多个实例(ChildCanvas)本身派生自Canvas,放置在一个基本自定义对象 (ExtendedCanvas) 上,该对象也扩展Canvas

我在自定义项中的鼠标事件处理程序中检测到鼠标单击。

虽然理论上我可以处理密钥事件并在密钥下降时设置布尔标志,并在键上升时清除它,但这不是一种可靠的方法,因为它需要将焦点放在处理密钥的任何组件上。

我看过的所有示例都需要一个特定的按键事件处理程序,但我不能在这种情况下应用这种方法,因为它似乎根本没有注册按键,即使实现事件处理程序的组件当时具有焦点。

我想找到一种方法来检查是否在鼠标单击处理程序中按住了某个键,如果在 WPF 中可以的话。

编辑:我尝试使用Keyboard.Modifiers方法,但这没有返回任何结果。

编辑:我也尝试了Keyboard.IsKeyDown(Key.LeftCtrl),它不返回任何值。

编辑:我试图通过在事件管理器上注册来全局处理关键事件,如图所示。我发现,键向上和向下键事件是快速连续触发的。第一个事件的属性e.IsRepeat为 false,所有后续事件e.IsRepeat设置为 true。使用这些事件,我设置了一个布尔值,该布尔值设置为在第一个 keyDown 事件中设置为truee.IsRepeat为 false(第一次初始按键),如果 keyUp 事件设置为 false,则设置为e.IsRepeatfalse(当物理释放键时,keyUp 事件会触发)。

这不起作用 - 按住键时单击画布上的项目会更改布尔值的状态,将其设置为 false。

此行为与Microsoft文档的键盘处理方式完全不一致。

EventManager.RegisterClassHandler(typeof(Control),
Keyboard.KeyDownEvent,new KeyEventHandler(keyDown),true);

我可以调用Keyboard.IsKeyToggled(Key.LeftCtrl)它确实显示切换状态,但它会随着每次按键而变化,并且不会显示鼠标单击时是否按住了该键。

public class ExtendedCanvas:Canvas {
public ExtendedCanvas() {
MouseUp += thisMouseUp;
}

void thisMouseUp(object sender,MouseButtonEventArgs e) {
if ((Keyboard.Modifiers & ModifierKeys.Control) > 0) {
//This does not work - no key is registered, as for some reason, Keyboard.Modifiers does not register that the key is held.
}
//If CONTROL is held down 
if (!ControlKeyHeldDown) {
ClearSelectedItems();
}
IsSelected = true;    
}
}

不一致的行为是 VMWare 选项的结果。

此虚拟机在 MacOS 上运行,尽管 VMWare Fusion 配置为直接发送控制键,但控制单击仍会触发辅助鼠标按钮(即在本例中为右键单击)。

解决方案是:

1) 关闭虚拟机。

2) 在 VMWare Fusion 首选项 -> 键盘和鼠标 ->鼠标快捷键中,启用(选中)"辅助按钮"选项(如果未选中)。

3) 关闭首选项窗口以保存设置。

4) 关闭 VMWare Fusion

5) 重新启动主机系统

6) 在 VMWare Fusion 首选项 -> 键盘和鼠标 -> 鼠标快捷键中,禁用(取消选中)"辅助按钮"选项。

7) 启动 VM,并确认"控制单击"不再触发辅助单击。

此选项已配置为在将 VMWare Fusion 从 8 升级到 10 之前直接发送控制。

似乎尽管未选中"辅助功能"复选框,但该属性已设置为 true,并且它的行为与设置建议的方式不一致。

最新更新