【问题标题】:Handle KeyDown during a drag drop在拖放期间处理 KeyDown
【发布时间】:2011-05-21 23:02:32
【问题描述】:

当我的控件(即 DragEnter 和 DragLeave 之间)正在进行拖放操作时,我需要响应 keydown 事件(O、C、G 键等,而不是修饰键)。但是,在此阶段不调用 KeyDown 事件。

我尝试选择我的控件并专门将焦点设置在 DragEnter 上,但这不起作用。

编辑:

Hans 的回答基本上是正确的,只是我必须使用 GetAsynchKeyState 来获得我想要的行为。

【问题讨论】:

    标签: winforms drag-and-drop keydown keyevent


    【解决方案1】:

    QueryContinueDrag 事件在拖动source 上引发。检查您感兴趣的键的状态将需要 pinvoke,该事件仅旨在帮助识别 Escape 键和修饰键状态更改。请记住,这些键有任何特殊操作是非常无法发现的。

        [DllImport("user32.dll")]
        private static extern short GetKeyState(Keys key);
    

    当按键按下时,它返回一个

    【讨论】:

    • 谢谢汉斯,会的。无需担心可发现性,在拖动操作期间,有关快捷键的附加信息将被绘制到控件中。
    【解决方案2】:

    您也可以尝试: Keyboard.IsKeyDown(); 检查特定键是否被按下的方法,即:

    bool isKeyPressed = Keyboard.IsKeyDown(Key.LeftAlt);
    

    与上一个答案类似,但它是一种原生 .NET 方法,因此不需要您导入任何函数。

    这里有人问过类似的问题:Handle KeyDown during a drag drop. Or keydown event not workign,但有人建议让它像活动一样工作。

    更新

    第一个解决方案似乎只适用于 WPF。但是,如果您想检查修饰键的状态,有一种方法可以利用属性Form.ModifierKeys,它应该可以在 WinForms 中正常工作。该示例显示了如何检查是否同时按下了 alt(左 alt)和 ctrl 键:

    if (Form.ModifierKeys == (Keys.Alt | Keys.Control))
    {
        //TODO: insert your code here
    }
    

    【讨论】:

    • 好建议,但现在允许使用 WPF。我只需要坚持使用winforms。
    • 哦,抱歉,我没注意到。但是,我找到了另一种方法来处理修饰键,在使用 WinForms 时应该可以正常工作。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-08
    相关资源
    最近更新 更多