C# 是否在不使用Windows窗体中的事件的情况下按下检测Shift键?

C# 是否在不使用Windows窗体中的事件的情况下按下检测Shift键?,c#,C#,我需要能够检测到shift键被按住,但我不想使用事件或全局变量来确定这一点。C#中是否有API,允许您询问当前按下的键,而不是使用事件?不确定是否在C#中可用,但您可以调用。此方法返回调用该方法时键的状态 要从C#调用它,您需要像使用任何其他Win32 API一样使用interop。Form.ModifierKeys (静态属性)您可以安装 使用系统; 使用系统诊断; 使用System.Windows.Forms; 使用System.Runtime.InteropServices; 类密钥 {

我需要能够检测到shift键被按住,但我不想使用事件或全局变量来确定这一点。C#中是否有API,允许您询问当前按下的键,而不是使用事件?

不确定是否在C#中可用,但您可以调用。此方法返回调用该方法时键的状态


要从C#调用它,您需要像使用任何其他Win32 API一样使用interop。

Form.ModifierKeys
(静态属性)

您可以安装

使用系统;
使用系统诊断;
使用System.Windows.Forms;
使用System.Runtime.InteropServices;
类密钥
{
专用常量int WH_键盘LL=13;
私有常量int WM_KEYDOWN=0x0100;
私有静态低层keyboardproc\u proc=HookCallback;
私有静态IntPtr _hookID=IntPtr.Zero;
公共静态void Main()
{
_hookID=SetHook(_proc);
Application.Run();
unhookwindowshookx(_hookID);
}
专用静态IntPtr SetHook(低级键盘程序)
{
使用(Process curProcess=Process.GetCurrentProcess())
使用(ProcessModule curModule=curProcess.MainModule)
{
返回SetWindowsHookEx(WH_键盘LL,proc,
GetModuleHandle(curModule.ModuleName),0);
}
}
私有委托IntPtr低层KeyboardProc(
int nCode、IntPtr wParam、IntPtr lParam);
私有静态IntPtr HookCallback(
int nCode、IntPtr wParam、IntPtr lParam)
{
如果(nCode>=0&&wParam==(IntPtr)WM\u KEYDOWN)
{
int vkCode=Marshal.ReadInt32(LPRAM);
Console.WriteLine((键)vkCode);
}
返回CallNextHookEx(_hookID,nCode,wParam,lParam);
}
[DllImport(“user32.dll”,CharSet=CharSet.Auto,SetLastError=true)]
私有静态外部IntPtr SetWindowsHookEx(int idHook,
低级键盘程序lpfn、IntPtr hMod、uint dwThreadId);
[DllImport(“user32.dll”,CharSet=CharSet.Auto,SetLastError=true)]
[返回:Marshallas(UnmanagedType.Bool)]
私有静态外部bool unhookwindowshookx(IntPtr hhk);
[DllImport(“user32.dll”,CharSet=CharSet.Auto,SetLastError=true)]
私有静态外部IntPtr CallNextHookEx(IntPtr hhk,intncode,
IntPtr wParam、IntPtr lParam);
[DllImport(“kernel32.dll”,CharSet=CharSet.Auto,SetLastError=true)]
私有静态外部IntPtr GetModuleHandle(字符串lpModuleName);
}
如果另一个修改键也按下(例如,Ctrl+Shift),则该值也将为
true
。如果要检查是否在没有任何其他修改器的情况下单独按下Shift键,请使用

if (Control.ModifierKeys == Keys.Shift)
请注意,如果另一个非修饰符关闭(例如,Shift+A),则即使该值也是
true
。如果要检查是否按下了Shift和only Shift,则必须使用API调用



如果您所在的类继承了
控件
(例如表单),则可以删除
控件
限定符。(
static
properties在继承的类中不需要限定符)

这是可行的,但是属性是从控件而不是表单继承的
if (Control.ModifierKeys == Keys.Shift)