.net 在拖放过程中忽略“向下键”
在拖放操作期间,我需要处理“KeyDown”事件 目标是在用户按住“alt”并拖动对象时显示一些通知或更改光标 但我注意到按键不起作用,只有ESC按钮以某种方式响应 我已尝试使用下一个DLL导入代码运行它:.net 在拖放过程中忽略“向下键”,.net,wpf,winapi,events,keyboard,.net,Wpf,Winapi,Events,Keyboard,在拖放操作期间,我需要处理“KeyDown”事件 目标是在用户按住“alt”并拖动对象时显示一些通知或更改光标 但我注意到按键不起作用,只有ESC按钮以某种方式响应 我已尝试使用下一个DLL导入代码运行它: [DllImport("user32.dll")] private static extern short GetKeyState(Keys key); 这可以显示按钮是否被按下,但我真的在寻找按钮甚至!拖动对象时如何处理键盘按下事件的任何提示?您可以尝试使用:
[DllImport("user32.dll")]
private static extern short GetKeyState(Keys key);
这可以显示按钮是否被按下,但我真的在寻找按钮甚至!拖动对象时如何处理键盘按下事件的任何提示?您可以尝试使用:
bool isKeyPressed = Keyboard.IsKeyDown(Key.LeftAlt);
并将其放入适合您需要的适当活动中,如DragEnter、DragOver或使用计时器以恒定速率检查钥匙状态
如果您使用的计时器触发事件的频率足够高(比如每100毫秒),它应该会立即做出反应。您可以使用附加标志来处理每次按键和释放一次(而不是每次计时器触发事件时)
更新
我实现它只是为了测试它,即使用户正在拖动某个东西,它似乎也能正常工作(我测试它是为了拖动文本)
这是一个简单的例子,当您想要检测一个特定键(左ALT)的向下键和向上键事件时,但是可以很容易地修改它以监视任意多个键
首先,向要检测向下键和向上键的窗口类添加两个字段:
此处使用了Dispatchermer,因此计时器引发的事件在窗口的UI线程上下文中执行
接下来,将方法Window\u Loaded
添加到窗口的Loaded
事件中
然后,您可以实现刚才添加为加载的事件处理程序的方法,并在那里初始化计时器:
private void Window_Loaded(object sender, RoutedEventArgs e)
{
timer.Tick += new EventHandler(timer_Tick);
//timer will raise an event checking key state each 100ms
timer.Interval = TimeSpan.FromMilliseconds(100);
timer.Start();
}
最后,您应该添加timer\u Tick
方法的实现,该方法用于检查要监视的密钥的状态:
void timer_Tick(object sender, EventArgs e)
{
if (Keyboard.IsKeyDown(Key.LeftAlt))
{
//checking flag to handle each key press only once
if (!keyPressed)
{
keyPressed = true;
//TODO: write your key down handling code here
//i.e.: sampleRichTextBox.AppendText("Left Alt is down;\t");
}
}
else
{
//checking flag to handle each key release only once
if (keyPressed)
{
keyPressed = false;
//TODO: write your key up handling code here
//i.e.: sampleRichTextBox.AppendText("Left Alt is up;\t");
}
}
}
如果您需要有关此解决方案的更多信息,请告诉我。我在执行鼠标捕获的窗体上获得了KeyDown事件,尽管它没有带焦点的控件。你尝试过什么?所有可能的控件都是用“keydown”处理程序签名的。我会运行spy++并查看键盘消息的去向。它们肯定会被生成。如果没有人回答,我会把你的答案标记为正确答案。但我真的需要按键事件一次(计时器会快速触发事件。)不,你可以检查按键是否按下,每次按下一次“事件”,然后跳过它直到释放。不过,我会看看是否有其他方法可以做到这一点。我曾尝试使用WndProc以WinApi方式获取每条消息,但当用户拖动文本时,WM_KEYDOWN也不会被触发。您也可以尝试在用户放下拖动的对象时识别按下的键,但是,使用计时器将更接近实际触发的事件。
void timer_Tick(object sender, EventArgs e)
{
if (Keyboard.IsKeyDown(Key.LeftAlt))
{
//checking flag to handle each key press only once
if (!keyPressed)
{
keyPressed = true;
//TODO: write your key down handling code here
//i.e.: sampleRichTextBox.AppendText("Left Alt is down;\t");
}
}
else
{
//checking flag to handle each key release only once
if (keyPressed)
{
keyPressed = false;
//TODO: write your key up handling code here
//i.e.: sampleRichTextBox.AppendText("Left Alt is up;\t");
}
}
}