【问题标题】:Is there a native .NET method or equivalent to user32.dll's GetKeyboardState?是否有本地 .NET 方法或等效于 user32.dll 的 GetKeyboardState?
【发布时间】:2011-03-11 17:55:08
【问题描述】:

回答:此方法没有本地管理的等效项。但是,可以在 pinvoke.net 找到一个很好的托管代码 API 示例。

大家好

我有一个接受“跟踪模式”标志的应用程序。跟踪模式打开包含文本框的表单。文本框通过自定义 TraceListener 对象显示输出。如果命令行中存在 -t,则跟踪窗口将从其自己的低优先级线程中打开。对于在出现问题时尝试诊断应用程序的顾问来说,它非常方便。

一些顾问要求在启动过程中按一些不起眼的组合键应该打开跟踪模式,这样他们就不必每次都去命令行激活它。这是一个合理的要求。

我不想为此给他们一个按钮或菜单项,因为顾问将关心的许多关键信息在启动时显示给 Trace 在主窗体创建之前,因为各种组件被实例化和初始化。

我认为在 .NET 中检测当前键盘状态应该足够简单 - 但似乎在我所见的任何地方,建议是使用 [DllImport("user32.dll", EntryPoint = "GetKeyboardState", SetLastError = true)] 作为检测正在发生的事情的方法。

这一切都很好 - 我很满意。但是,作为一般经验法则,我会尝试确保在尝试使用自己的 Windows 功能之前使用本机 .NET 托管代码。

是否有本地 .NET 方法或等效于 user32.dll 的 GetKeyboardState?

【问题讨论】:

    标签: c# keyboard key user32 managed-code


    【解决方案1】:

    你确定 PreviewKeyDownEventArgs 没有你需要的吗?如果是,那么您可以使用 PreviewKeyDown 事件。

    另一个选项可能是加速键。 Windows API 函数可以使用应用程序资源中的快捷键表将键盘序列映射到命令,其中命令与菜单项的作用相同;你知道,一条 WM_COMMAND 消息。我知道在 MFC 中使用 C++ 很容易做到,但是当我试图找到 C# 的方法时,我迷路了。如果您能弄清楚如何使用 C# 进行加速键,那么它可能是一个灵活的解决方案。

    【讨论】:

    • 嗨,山姆。我不认为 PreviewKeyDown 可以在这里帮助我。在实例化任何表单之前,我试图从 Program.Main 中获取键盘状态。据我所知,我实际上没有要绑定的 PreviewKeyDown 事件。感谢您提供有关加速键的建议,但我认为我会使用 p/invoking user32.dll(我已经知道该怎么做),而不是使用加速键,这对我来说是一个新概念。
    • GetKeyboardState 文档说“状态会随着线程从其消息队列中删除键盘消息而改变”。请注意,必须删除键盘消息并显示消息队列。 GetKeyboardState 要求存在消息队列。您的评论“在任何表单被实例化之前”是另一种说法,即还没有消息队列,但如果 GetKeyboardState 有效,那么就有一个消息队列。如果 GetKeyboardState 有效,那么还有一个消息循环正在读取键盘消息。
    • 哇!我不知道这里的 cmets 大小有限制。所以记录在案的做你想做的事情的方法是在消息处理程序中做。您可以使用 Spy++ 来确定处理您从中获取 GetKeyboardState 的键盘消息。
    【解决方案2】:

    Control.ModiferKeysControl 的静态属性,如果有的话,当前按下了修饰键。我不知道有什么可以获取一般键盘状态,似乎大多数代码 P/Invoke 使用GetKeyboardStateGetKeyState 来检查特定键。

    【讨论】:

    • 谢谢唐尼。 Control.ModifierKeys 会给我 control/shift/alt 键,但不是任何可能按下或不按下的字母键。我认为您必须 p/invoke GetKeyboardState 或 GetKeyState 是正确的。证实了我的怀疑 - 谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-30
    • 1970-01-01
    • 2012-02-03
    • 2012-09-03
    • 1970-01-01
    • 2019-09-12
    相关资源
    最近更新 更多