当用户拖放工作正常时,我需要处理事件“KeyDown”。
使用示例。 当用户点击“alt”时,光标下的某些图像将被更改,用户可以删除其他项目数据。
但是KeyDown根本不工作!只有esc按钮!!
请帮忙。我真的需要确定事件。
P.S。我试过这段代码:
[DllImport("user32.dll")]
private static extern short GetKeyState(Keys key);
但我只能在鼠标移动时确定点击按钮。但我真的需要关键向下事件来确定点击了alt。
答案 0 :(得分:2)
您可以尝试使用:
bool isKeyPressed = Keyboard.IsKeyDown(Key.LeftAlt);
并将其置于适合您需求的适当事件中,例如DragEnter,DragOver或使用计时器并以恒定速率检查键的状态。
如果你使用一个经常触发事件的定时器(比如每100毫秒),它应该会立即做出反应。您可以使用额外的标记来处理每次按键并释放一次(并且每次定时器触发其事件时都不会。)
<强>更新强>
我已经实现了它,只是为了测试它,即使用户正在拖动某些内容它似乎也能正常工作(我已经测试了这个用于拖动文本)。
这是一个简单的案例,当您想要检测一个特定键(左侧ALT)的键下和键上事件时,可以很容易地修改它根据需要监控任意数量的密钥。
首先,将两个字段添加到要检测键向下和键向上的Window类中:
DispatcherTimer timer = new DispatcherTimer();
bool keyPressed = false;
这里使用了 DispatcherTimer
,因此计时器引发的事件在窗口的UI线程的上下文中执行。
接下来,将方法Window_Loaded
添加到窗口的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_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");
}
}
}
如果您需要有关此解决方案的更多信息,请与我们联系。