ICode9

精准搜索请尝试: 精确搜索
首页 > 系统相关> 文章详细

c# – 无法在鼠标事件处理程序中读取WPF中保持的键状态 – VMWare Fusion for Mac中Windows guest虚拟机中的行为不一致

2019-07-05 14:14:44  阅读:272  来源: 互联网

标签:c keyboard wpf mouseevent


此问题是由vmware融合中的不一致设置引起的 – MacOS的辅助鼠标功能(即右键单击)由控件左键单击触发,尽管在vmware融合设置中配置为通过单独发送控件键.

我将其留在此处,因为它概述了隔离问题所采取的诊断步骤.

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

这不是重复 – 我尝试过建议的方法 – 它们不起作用.请提供真正的帮助.

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

我已经尝试使用记录和接受的获取密钥的方法(Keyboard.IsKeyDown和Keyboard.Modifiers),尽管它们应该可以工作,但在这种情况下它们不会.

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

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

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

我的申请结构如下:

主窗口 – > Dock Panel – > ScrollViewer – >主要自定义组件(扩展画布) – > ChildCanvas对象(多个实例,都可以扩展Canvas).

该组件将没有任何引用回主窗口 – 这绝对不可协商.

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

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

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

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

虽然我理论上可以处理键事件并在键关闭时设置一个bool标志并在键上升时清除它,但这不是一种可行的方法,因为它需要将焦点放在处理哪个组件上钥匙.

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

我想找到一种方法来检查在WPF中是否可以在鼠标单击处理程序中按下某个键.

编辑:我已尝试使用Keyboard.Modifiers方法,但这不会返回任何结果.

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

编辑:我试图通过在EventManager上注册来全局处理键事件,如图所示.我发现的是,快速连续触发按键和按键事件.第一个事件将属性e.IsRepeat设置为false,并且所有后续事件事件都将e.IsRepeat设置为true.使用这些事件,我设置了bool,在第一个keyDown事件中设置为true,e.IsRepeat为false(第一个初始键按下),如果e.IsRepeat为false(keyUp),则在keyUp事件中设置为false密钥被物理释放时触发事件).

这不起作用 – 当按住键时单击画布上的项目会改变bool的状态,将其设置为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选项的结果.

此VM正在MacOS上运行,尽管VMWare Fusion配置为直接发送Control键,Control Click仍然触发辅助鼠标按钮(即,在这种情况下右键单击).

解决方案是:

1)关闭VM.

2)在VMWare Fusion首选项中 – >键盘和鼠标 – >鼠标快捷方式,如果未选中,则启用(选中)“辅助按钮”选项.

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

4)关闭VMWare Fusion

5)重新启动主机系统

6)在VMWare Fusion首选项中 – >键盘和鼠标 – >鼠标快捷方式,禁用(取消选中)“辅助按钮”选项.

7)启动VM,并确认Control Click不再触发辅助点击.

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

看起来虽然未选中辅助功能复选框,但该属性设置为true,并且它的设置与设置建议的方式不一致.

标签:c,keyboard,wpf,mouseevent
来源: https://codeday.me/bug/20190705/1388183.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有