我需要响应 keydown 事件(O、C、G 键等,而不是修饰键),同时在我的控件上进行 Drag+Drop 操作(即在 DragEnter 和 DragLeave 之间)。但是,在此阶段不调用 KeyDown 事件。
我尝试选择我的控件并专门将焦点设置在 DragEnter 上,但这不起作用。
编辑:
Hans 的回答基本上是正确的,除了我必须使用 GetAsynchKeyState 来获得我想要的行为。
我需要响应 keydown 事件(O、C、G 键等,而不是修饰键),同时在我的控件上进行 Drag+Drop 操作(即在 DragEnter 和 DragLeave 之间)。但是,在此阶段不调用 KeyDown 事件。
我尝试选择我的控件并专门将焦点设置在 DragEnter 上,但这不起作用。
编辑:
Hans 的回答基本上是正确的,除了我必须使用 GetAsynchKeyState 来获得我想要的行为。
QueryContinueDrag 事件在拖动源上引发。检查您感兴趣的键的状态将需要 pinvoke,该事件仅旨在帮助识别 Escape 键和修饰键状态更改。需要记住的是,这些键有任何特殊动作是非常难以发现的。
[DllImport("user32.dll")]
private static extern short GetKeyState(Keys key);
当键按下时,它返回一个 < 0 的值。我不能说它可以保证正常工作,但是当我尝试它时它看起来不错。
您还可以尝试:
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
}