C# GetKeyState()计算不正确

C# GetKeyState()计算不正确,c#,winapi,hook,C#,Winapi,Hook,代码中的GetKeyState()计算不正确。。当我使用此选项时: bool ctrlDown = GetKeyState(VK_LCONTROL) != 0 || GetKeyState(VK_RCONTROL) != 0; 在我的代码中,返回的信息不正确。。在所有按键事件中触发,即使按下其他按键,也会将其评估为true。。有人能看到我在这个代码中做错了什么吗 我把它装在这里: [DllImport("user32.dll", CharSet = CharSet.Auto, Cal

代码中的GetKeyState()计算不正确。。当我使用此选项时:

 bool ctrlDown = GetKeyState(VK_LCONTROL) != 0 || GetKeyState(VK_RCONTROL) != 0;
在我的代码中,返回的信息不正确。。在所有按键事件中触发,即使按下其他按键,也会将其评估为true。。有人能看到我在这个代码中做错了什么吗

我把它装在这里:

    [DllImport("user32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]
    public static extern short GetKeyState(int nVirtKey);
然后我调用“VK_LCONTROL&VK_RCONTROL”变量并填充它们:

    public const int VK_LCONTROL = 0xA2;
    public const int VK_RCONTROL = 0xA3;
然后我在这个函数中调用它:

private int KbHookProc(int nCode, IntPtr wParam, IntPtr lParam)
    {
        var hookStruct = (KbLLHookStruct)Marshal.PtrToStructure(lParam, typeof(KbLLHookStruct));

        bool ctrlDown = GetKeyState(VK_LCONTROL) != 0 || GetKeyState(VK_RCONTROL) != 0;

        if (nCode >= 0 && wParam == (IntPtr)WM_KEYUP && hookStruct.vkCode == 0x56 && ctrlDown == true)
        {

                MessageBox.Show("Message : KEY UP");
                ComboHit = false;
        }

        // Pass to other keyboard handlers. Makes the Ctrl+V pass through.
        return CallNextHookEx(_hookHandle, nCode, wParam, lParam);        
    }
当我检查以查看“GetKeyState(VK_LCONTROL)”返回的内容时。。它在0和1之间来回交替,我不知道微软说它应该这样做: 检索指定虚拟键的状态。该状态指定键是向上、向下还是切换(每次按下键时交替打开、关闭)


我为什么要这个?。。我能让它准确地评估上下键的位置吗

要测试某个键是否按下,需要检查高位:

(GetKeyState(vk)&0x8000)

为什么不直接使用

像这样的

public partial class myForm : Form
{
    public myForm()
    {
        InitializeComponent();
    }

    private void myForm_Load(object sender, EventArgs e)
    {
        KeyPreview = true;
        KeyUp += (s, ek) =>
                     {
                         if (ek.KeyCode == Keys.V && ModifierKeys.HasFlag(Keys.Control))
                             MessageBox.Show("Yerp, it done happened");
                     };
    }
}

你到底想干什么? 我想也许你可以看看GetKeyboardState方法


不要使用!=0使用<0来检测按键是否已按下。就是这样@Hans\u Passant感谢您的帮助。最终,使用我在其中输入的代码,我正在尝试检查并停止键盘上的ctrl+V。您能显示此操作吗。。我不懂你的意思。。对不起,我是C#新手,你是需要在按键释放时触发事件,还是只允许在按键打开时触发事件?我需要知道是否同时按下了CTRL+V,然后只在播放器释放按钮时触发。