Обнаружение keyup на winform без какого-либо контроля - PullRequest
1 голос
/ 23 июня 2011

Как указано в заголовке, у меня есть форма, которая не имеет никакого контроля над собой (поэтому я не могу сфокусировать ее! Черт).

Я держу ее без контроля, потому что мне нужно показатьизображения на фоне, и мне нужно переместить его, удерживая нажатой кнопку мыши.

Есть ли способ обнаружить событие keyup, когда это окно переднего плана? следует ли использовать глобальный хук (и проверить, какое изображение переднего плана)Ясно)?

Любой более простой обходной путь? Я тестировал со скрытым элементом управления, но он не работает.

Проблема установки элемента управления с непрозрачностью = 0 дает возможность "пропустить" MouseDown иСобытия MouseUp (потому что они могут происходить над элементом управления вместо формы, но я все еще могу перенаправить их)

Любое предложение?

Вот вопрос, где я выбрал некоторые ресурсы: Событие пожарной формы KeyPress

Ответы [ 3 ]

3 голосов
/ 23 июня 2011

Разве вы не можете просто установить KeyPreview формы в true и использовать событие KeyUp формы?(или я что-то упустил?)

3 голосов
/ 23 июня 2011

Я бы переопределил OnKeyUp, так как он, кажется, именно то, что вы просите. Вот пример появления окна сообщений при отпускании клавиши Escape.

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

        base.OnKeyUp(e);
    }
0 голосов
/ 23 июня 2011

Похоже, что вы ищете 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);
     }
}
...