代码之家  ›  专栏  ›  技术社区  ›  chiccodoro

WinForms检索没有窗体/用户控件的键盘状态

  •  2
  • chiccodoro  · 技术社区  · 15 年前

    我想找回 Ctrl 钥匙放在我没有表格的地方。

    通常情况下,为了获得一个键状态,我会使用control键控/键控事件。但是,需要知道是否按了ctrl的代码在任何窗体之外。显示了一个表单,但代码是假定的 依赖于该形式,但要自己找到键状态。

    当然有办法做到这一点,但我在谷歌上找不到。

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

    背景:

    在应用程序启动阶段,如果在那一刻按下ctrl键,我希望有一个步骤的行为有所不同。启动阶段显示一个启动屏幕,但启动的代码不知道这一点。相反,它将进度报告给回调,回调将更新初始屏幕。

    如果我使用启动屏幕获取keydown事件,我会使启动代码依赖于启动屏幕,这会引入循环依赖关系。我想保持自由,移除喷溅屏幕,换成其他东西。

    3 回复  |  直到 15 年前
        1
  •  10
  •   Pondidum    15 年前

    可以在上使用静态方法 Control 打电话 ModifierKeys

    Control.ModifierKeys on MSDN

    如:

    if (Control.ModifierKeys == Keys.Control)
    {
        //...
    }
    
        2
  •  3
  •   testalino    15 年前

    我最近做的正是:

        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);
            }
        }
    
        3
  •  0
  •   Øyvind Bråthen    15 年前

    你就不能抓住 Ctrl 被压在表格上 显示,因为似乎此表单也是应用程序的一部分,并使用表单可以调用的事件将单击中继到代码的“无格式”部分?

    我可能会误解你在这里的目的,但这至少是一个选择。