我想在没有表单的地方检索Ctrl
键的状态。
通常,要获得密钥状态,我会使用Control_KeyDown / KeyUp事件。但是,需要知道是否按下Ctrl的代码在任何形式之外。显示了一个表单,但代码应该不依赖于该表单,但是自己找到键状态。
肯定有办法做到这一点,只有我没有成功在谷歌上找到它。
请注意,虽然代码没有“拥有”可用的表单,但它仍然是WinForms应用程序,因此框架可能为我提供了一些类/对象来实现该目标。
背景
在应用程序启动阶段,如果在那一刻按下Ctrl键,我希望一步操作不同。启动阶段显示启动屏幕,但启动代码不知道这一点。相反,它会向回调报告进度,并且该回调会更新启动屏幕。
如果我使用启动画面获取KeyDown事件,我会使启动代码依赖于启动画面,这会引入循环依赖关系。我想保留自由去除闪屏并用不同的东西替换。
答案 0 :(得分:10)
您可以在名为Control
ModifierKeys
上使用静态方法
例如:
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
,因为看起来这个表单也是应用程序的一部分,并将点击转发给使用表单可以调用的事件的代码的“无形”部分?
我可能会误解你在这之后的情况,但它似乎至少是一种选择。