В моем захвате клавиатуры каждое нажатие клавиши получает флаг, который указывает, было ли это введено или нет. 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) {...
Удачи!
Я не уверен, будет ли это полезно для вас, но это был бы довольно простой способ сделать это, не уверен в точной «скорости» этого, хотя.
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 константу для этого, а не включать шестнадцатеричное значение непосредственно в свой код!)
Причина, по которой все говорят, что используют побитовые и а затем сравнить с нулем или флагом:
0111 1000 // kbd.flags
& 0001 0000 // Injected
=
0001 0000 // (!= 0 or ==Injected)
Вам необходимо убедитесь, что Bitflag установлен. Легко сделать с побитовыми операциями. Документация заявляет, что бит четыре используются для введенного флага, бит 4 (или 5, если вы считаете первый бит как 1), равно 16, так что вы можете сделать побитовое и против флага.
if ((kbd.flags & 16) == 16)
{
FireTorpedoes();
}
Вы можете узнать больше о битовых операциях здесь:
С помощью оператора AND проверьте, установлен ли соответствующий бит в переменной flags:
if (kbd.flags & LLKHF_INJECTED)
{
...
}
.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..
}