如标题所述,我有一张表格本身没有任何控制权(所以我无法集中注意力!该死的)。
我让它无法控制,因为我需要在背景上显示图像,我需要通过点击鼠标来移动它。
当这是前景窗口时,有没有办法检测keyup事件?我应该使用全局钩子(并且明确地检查哪个是前景图像)?
任何更简单的解决方法?我使用隐藏控件进行了测试,但它无法正常工作。
使用opacity = 0设置控件的问题带来了“错过”MouseDown和MouseUp事件的可能性(因为它们可能发生在控件而不是表单上,但我仍然可以重定向它们)
有什么建议吗?
以下是我选择一些资源的问题: Fire Form KeyPress event
答案 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);
}
}