Как я использую низкоуровневые 8 битовые флаги в качестве условных выражений?

В моем захвате клавиатуры каждое нажатие клавиши получает флаг, который указывает, было ли это введено или нет. http://msdn.microsoft.com/en-us/library/ms644967 (По сравнению с 85) .aspx

Я дистиллировал KBDLLHOOKSTRUCT от lParam. Я могу получить доступ к kbd.flags. XXX. Я просто не знаю, как преобразовать этот флаг на 8 битов в if (injected) {... введите условное выражение, которое я знаю, как использовать.

Если бы один из Вас, умные типы информатики выручили бы меня, я был бы очень признателен за его.

    private static IntPtr HookCallback(int nCode, IntPtr wParam, IntPtr lParam)
    {
        KBDLLHOOKSTRUCT kbd = new KBDLLHOOKSTRUCT();
        Marshal.PtrToStructure(lParam, kbd);

        //if (injected) {...

Удачи!

6
задан cksubs 16 January 2010 в 01:16
поделиться

5 ответов

Я не уверен, будет ли это полезно для вас, но это был бы довольно простой способ сделать это, не уверен в точной «скорости» этого, хотя.

List<string> collection = new List<string>();

collection.Sort();

foreach(string value in collection)
{
   if(value == "stringToLookFor")
   {
       return value;
   }
{
-121--2681531-

Посмотрите на некоторые из этих тем . Поскольку проекты являются открытыми, вы должны иметь возможность внимательно изучить их.

-121--2304521-

Нужно побитово - и он с маской. Например, введенный бит является битом 4. Двоичный 00010000, шестнадцатеричный 0x10. Итак, побитово - и это с 0x10, и посмотрите, если что-то осталось:

bool isInjected = ((kbd.flags & 0x10) != 0);

(Конечно, согласно ответу Андрея, было бы хорошей идеей определить LLKHF_INJECTED константу для этого, а не включать шестнадцатеричное значение непосредственно в свой код!)

7
ответ дан 8 December 2019 в 04:52
поделиться

Причина, по которой все говорят, что используют побитовые и а затем сравнить с нулем или флагом:

  0111 1000        // kbd.flags 
& 0001 0000        // Injected
          =
  0001 0000        // (!= 0 or ==Injected)
2
ответ дан 8 December 2019 в 04:52
поделиться

Вам необходимо убедитесь, что Bitflag установлен. Легко сделать с побитовыми операциями. Документация заявляет, что бит четыре используются для введенного флага, бит 4 (или 5, если вы считаете первый бит как 1), равно 16, так что вы можете сделать побитовое и против флага.

if ((kbd.flags & 16) == 16)
{
    FireTorpedoes();
}

Вы можете узнать больше о битовых операциях здесь:

2
ответ дан 8 December 2019 в 04:52
поделиться

С помощью оператора AND проверьте, установлен ли соответствующий бит в переменной flags:

if (kbd.flags & LLKHF_INJECTED)
{
    ...
}
2
ответ дан 8 December 2019 в 04:52
поделиться

.NET поддерживает это с атрибутом [Флаги]:

[Flags]
enum KbdHookFlags {
  Extended = 0x01,
  Injected = 0x10,
  AltPressed = 0x20,
  Released = 0x80
}

Использование образца:

  KBDLLHOOKSTRUCT info = (KBDLLHOOKSTRUCT)Marshal.PtrToStructure(lParam, typeof(KBDLLHOOKSTRUCT));
  if ((info.flags & KbdHookFlags.Released) == KbdHookFlags.Released) {
    // Key was released
    // etc..
  }
11
ответ дан 8 December 2019 в 04:52
поделиться
Другие вопросы по тегам:

Похожие вопросы: