2

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

大家好

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

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

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

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

这一切都很好——我对此很满意。但是,作为一般经验法则,我会尝试确保在尝试自行开发之前使用本地 .NET 托管代码来实现 Windows 功能。

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

4

2 回答 2

1

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

于 2010-07-05T01:25:49.117 回答
0

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

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

于 2010-07-05T02:57:09.143 回答