.net 在拖放过程中忽略“向下键”

.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); 这可以显示按钮是否被按下,但我真的在寻找按钮甚至!拖动对象时如何处理键盘按下事件的任何提示?您可以尝试使用:

在拖放操作期间,我需要处理“KeyDown”事件

目标是在用户按住“alt”并拖动对象时显示一些通知或更改光标

但我注意到按键不起作用,只有ESC按钮以某种方式响应

我已尝试使用下一个DLL导入代码运行它:

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