1

如标题中所述,我有一个无法对其自身进行任何控制的表单(所以我无法集中注意力!!!该死)。

我保持它不受控制,因为我需要在背景上显示图像并且我需要通过按住鼠标来移动它。

当这是前景窗口时,有什么方法可以检测到 keyup 事件?我应该使用全局挂钩(并检查哪个是前景图像)?

有更简单的解决方法吗?我使用隐藏控件进行了测试,但它不起作用。

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

有什么建议吗?

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

4

3 回答 3

3

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

于 2011-06-23T03:37:22.613 回答
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);
    }
于 2011-06-23T04:00:05.797 回答
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);
     }
}
于 2011-06-23T03:33:56.453 回答