GetKeyState () неправильно оценивает - PullRequest
0 голосов
/ 25 января 2012

GetKeyState () в моем коде не оценивается правильно .. когда я использую это:

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

в моем коде не возвращается с правильной информацией .. он срабатывает на все ключевые события иего оценивают как истинное, даже когда нажимаются другие клавиши. Кто-нибудь может увидеть, что я делаю что-то не так в этом коде?

Я загружаю это здесь:

    [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 и 1, я знал, что MS говорит, что должен сделать это: «Получает состояние указанного виртуального ключа. Статус указывает, является ли ключ вверх, вниз или переключен (вкл, выкл)- чередование при каждом нажатии клавиши). "

с чего бы мне это хотеть? .. и могу ли я заставить его точно оценивать положение клавиш вверх или вниз?

Ответы [ 3 ]

8 голосов
/ 25 января 2012

Чтобы проверить, не нажата ли клавиша, вам нужно проверить старший бит:

(GetKeyState(vk) & 0x8000)

1 голос
/ 25 января 2012

Почему бы просто не использовать 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");
                     };
    }
}
0 голосов
/ 25 января 2012

Что именно вы пытаетесь сделать? Я думаю, что, возможно, вы могли бы взглянуть на метод GetKeyboardState

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...