GetKeyState()未正确评估

时间:2012-01-24 23:07:14

标签: c# winapi hook

我的代码中的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" var并填充它们:

    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和0之间来回交替。 1,我知道MS说应该这样做: "检索指定虚拟键的状态。状态指定键是上,下或切换(每次按下键时开启,关闭 - 交替)。 "

为什么我想要这个?...我可以让它准确地评估键的上升或下降位置吗?

3 个答案:

答案 0 :(得分:7)

要测试密钥是否已关闭,您需要检查高位:

(GetKeyState(vk) & 0x8000)

答案 1 :(得分:1)

为什么不使用Control.ModifierKeys

这样的东西?

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");
                     };
    }
}

答案 2 :(得分:0)

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

https://stackoverflow.com/a/709641/55774