棘手的c#形式键盘输入焦点问题

时间:2010-08-26 17:50:20

标签: c# forms focus

我有一个应用程序使用以下代码来获取基于从第三方应用程序生成的文件的输入。

    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,并在OnShown回调期间调用this.Activate()。这适用于大多数机器,但偶尔键盘输入不会传递给我的应用程序,例如,如果按下F1,则会弹出Windows帮助。

任何人都可以解释这种行为吗?我需要确保我的表单会收到这些键盘事件。

干杯, 理查德

1 个答案:

答案 0 :(得分:3)

让您的表单TopMost 足以确保此方法运行。您的表单也需要关注。这需要调用其Activate()方法(Win32 API中的SetForegroundWindow)。哪个保证可以运行,您无法将焦点从用户正在使用的窗口中移开。只有当自上次输入事件以来已经过了足够的时间才能获得焦点。

不确定你真正想做什么,也许你需要键盘钩子或使用RegisterHotKey。