在拖放期间处理KeyDown。或keydown事件无法正常工作

时间:2012-01-19 16:19:45

标签: .net wpf winapi events keyboard

当用户拖放工作正常时,我需要处理事件“KeyDown”。

使用示例。 当用户点击“alt”时,光标下的某些图像将被更改,用户可以删除其他项目数据。

但是KeyDown根本不工作!只有esc按钮!!

请帮忙。我真的需要确定事件。

P.S。我试过这段代码:

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

但我只能在鼠标移动时确定点击按钮。但我真的需要关键向下事件来确定点击了alt。

1 个答案:

答案 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");
            }
        }
    }

如果您需要有关此解决方案的更多信息,请与我们联系。