在没有任何控制的情况下检测winform上的keyup

时间:2011-06-23 03:27:52

标签: c# winforms onkeyup

如标题所述,我有一张表格本身没有任何控制权(所以我无法集中注意力!该死的)。

我让它无法控制,因为我需要在背景上显示图像,我需要通过点击鼠标来移动它。

当这是前景窗口时,有没有办法检测keyup事件?我应该使用全局钩子(并且明确地检查哪个是前景图像)?

任何更简单的解决方法?我使用隐藏控件进行了测试,但它无法正常工作。

使用opacity = 0设置控件的问题带来了“错过”MouseDown和MouseUp事件的可能性(因为它们可能发生在控件而不是表单上,但我仍然可以重定向它们)

有什么建议吗?

以下是我选择一些资源的问题: Fire Form KeyPress event

3 个答案:

答案 0 :(得分:3)

您不能将表单的KeyPreview设置为true并使用表单的KeyUp事件吗? (或者我错过了什么?)

答案 1 :(得分:3)

我会覆盖OnKeyUp,因为它似乎正是你所要求的。以下是释放Escape键时弹出消息框的示例。

    protected override void OnKeyUp(KeyEventArgs e)
    {
        if (e.KeyCode == Keys.Escape)
        {
            MessageBox.Show("Escape was pressed");
            e.Handled = true;
        }

        base.OnKeyUp(e);
    }

答案 2 :(得分:0)

看起来您正在寻找GlobalHook。请查看SetWindowsHookEx Native Api。您可以轻松编写Pinvoke语句。 以下是pinvoke.net

的示例
using System.Windows.Forms;
public class MyClass
{
     private HookProc myCallbackDelegate = null;

     public MyClass()
     {
     // initialize our delegate
     this.myCallbackDelegate = new HookProc(this.MyCallbackFunction);

     // setup a keyboard hook
     SetWindowsHookEx(HookType.WH_KEYBOARD, this.myCallbackDelegate, IntPtr.Zero, AppDomain.GetCurrentThreadId());
     }

     [DllImport("user32.dll")]
     protected static extern IntPtr SetWindowsHookEx(HookType code, HookProc func, IntPtr hInstance, int threadID);

     [DllImport("user32.dll")]
     static extern int CallNextHookEx(IntPtr hhk, int nCode, IntPtr wParam, IntPtr lParam);

     private int MyCallbackFunction(int code, IntPtr wParam, IntPtr lParam)
     {
    if (code < 0) {
        //you need to call CallNextHookEx without further processing
        //and return the value returned by CallNextHookEx
        return CallNextHookEx(IntPtr.Zero, code, wParam, lParam);
    }
     // we can convert the 2nd parameter (the key code) to a System.Windows.Forms.Keys enum constant
     Keys keyPressed = (Keys)wParam.ToInt32();
     Console.WriteLine(keyPressed);
    //return the value returned by CallNextHookEx
    return CallNextHookEx(IntPtr.Zero, code, wParam, lParam);
     }
}