Сложная проблема с фокусом ввода на клавиатуре c # - PullRequest
0 голосов
/ 26 августа 2010

У меня есть приложение, использующее следующий код для получения ввода на основе файла, созданного из стороннего приложения.

    protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
    {
        const int WM_KEYDOWN = 0x100;
        const int WM_SYSKEYDOWN = 0x104;

        if ((msg.Msg == WM_KEYDOWN) || (msg.Msg == WM_SYSKEYDOWN))
        {
            switch (keyData)
            {
                case Keys.F1:
                    clicked_F1(null, null);
                    break;

                case Keys.F2:
                    clicked_F2(null, null);
                    break;

                case Keys.F3:
                    clicked_F3(null, null);
                    break;
            }
            return true;
        }
        return base.ProcessCmdKey(ref msg, keyData);
    }

Form.TopMost имеет значение true, и this.Activate () вызывается во время обратного вызова OnShown.Это работает на большинстве машин, но иногда ввод с клавиатуры не будет передаваться моему приложению, например, при нажатии клавиши F1 всплывет справка Windows.

Может кто-нибудь объяснить это поведение?Мне нужно убедиться, что моя форма будет получать эти события клавиатуры.

Приветствия, Ричард

1 Ответ

3 голосов
/ 26 августа 2010

Наличие вашей формы TopMost не достаточно для обеспечения работы этого метода. Ваша форма также должна иметь фокус. Это требует вызова его метода Activate () (SetForegroundWindow в Win32 API). Который не гарантированно работает, вы не можете украсть фокус от окна, которое активно использует пользователь. Только после того, как прошло достаточно времени с последнего входного события, вы можете захватить фокус.

Не уверен, что вы действительно пытаетесь сделать, возможно, вам нужен хук для клавиатуры или используйте RegisterHotKey.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...