2

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

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

编辑:

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

4

2 回答 2

3

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

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

当键按下时,它返回一个 < 0 的值。我不能说它可以保证正常工作,但是当我尝试它时它看起来不错。

于 2010-12-08T02:21:29.150 回答
2

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

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

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

此处提出了类似的问题:Handle KeyDown during a drag drop。或者 keydown 事件不是 workign,但有人建议让它像一个事件一样工作。

更新

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

if (Form.ModifierKeys == (Keys.Alt | Keys.Control))
{
    //TODO: insert your code here
}
于 2012-01-20T18:07:36.130 回答