WinForms检索没有Form / UserControl的键盘状态

时间:2010-09-30 10:31:01

标签: c# winforms .net-3.5 keyboard

我想在没有表单的地方检索Ctrl键的状态。

通常,要获得密钥状态,我会使用Control_KeyDown / KeyUp事件。但是,需要知道是否按下Ctrl的代码在任何形式之外。显示了一个表单,但代码应该依赖于该表单,但是自己找到键状态。

肯定有办法做到这一点,只有我没有成功在谷歌上找到它。

请注意,虽然代码没有“拥有”可用的表单,但它仍然是WinForms应用程序,因此框架可能为我提供了一些类/对象来实现该目标。

背景

在应用程序启动阶段,如果在那一刻按下Ctrl键,我希望一步操作不同。启动阶段显示启动屏幕,但启动代码不知道这一点。相反,它会向回调报告进度,并且该回调会更新启动屏幕。

如果我使用启动画面获取KeyDown事件,我会使启动代码依赖于启动画面,这会引入循环依赖关系。我想保留自由去除闪屏并用不同的东西替换。

3 个答案:

答案 0 :(得分:10)

您可以在名为Control

ModifierKeys上使用静态方法

Control.ModifierKeys on MSDN

例如:

if (Control.ModifierKeys == Keys.Control)
{
    //...
}

答案 1 :(得分:3)

我最近刚刚完成了这件事:

    static class NativeMethods
    {
        public static bool IsControlKeyDown()
        {
            return (GetKeyState(VK_CONTROL) & KEY_PRESSED) != 0;
        }
        private const int KEY_PRESSED = 0x8000;
        private const int VK_CONTROL = 0x11;
        [System.Runtime.InteropServices.DllImport("user32.dll")]
        static extern short GetKeyState(int key);
    }

要测试代码,请创建一个新的控制台应用程序并使用以下主要方法:

    static void Main(string[] args)
    {
        for (int i = 0; i < 100; i++)
        {
            Console.WriteLine(NativeMethods.IsControlKeyDown());
            System.Threading.Thread.Sleep(100);
        }
    }

答案 2 :(得分:0)

你不能只抓住 显示的表单上的Ctrl,因为看起来这个表单也是应用程序的一部分,并将点击转发给使用表单可以调用的事件的代码的“无形”部分?

我可能会误解你在这之后的情况,但它似乎至少是一种选择。