In meinem Tastatur-Hook erhält jeder Tastendruck ein Flag, das angibt, ob es injiziert wurde oder nicht. http://msdn.microsoft.com/en-us/library/ms644967(VS.85).aspxWie verwende ich Low-Level-8-Bit-Flags als Bedingung?
Ich habe einen KBDLLHOOKSTRUCT aus dem LParam destilliert. Ich kann auf kbd.flags.XXX zugreifen. Ich weiß nur nicht, wie man dieses 8bit-Flag in einen if (injected) {...
-Typ-Conditional konvertiert, den ich zu verwenden weiß.
Wenn einer von Ihnen intelligente Informatik-Typen mir helfen würde, würde ich es wirklich schätzen.
private static IntPtr HookCallback(int nCode, IntPtr wParam, IntPtr lParam)
{
KBDLLHOOKSTRUCT kbd = new KBDLLHOOKSTRUCT();
Marshal.PtrToStructure(lParam, kbd);
//if (injected) {...
Prost!
Diese (und andere hier, die ich versucht habe,) wirft eine 'Eine erste Chance 'Ausnahme vom Typ' System.ArgumentException 'aufgetreten in foofoo.exe' Scheint, den vorherigen Tastatur-Hook-Code, den ich hatte, zu vermasseln. Was gibt? Es wird auch nicht kompiliert, wenn ich keine Klammern hinzufüge: 'bool isInjected = ((kbd.flags & LLKHF_INJECTED)! = 0);' ... ändert sich der Code? – cksubs
Die zusätzlichen Parens ändern den Code nicht - sie beheben nur meinen albernen Präzedenzfehler. Antwort aktualisiert – itowlson
Keine Ahnung, woher die ArgumentException kommt, da Sie nur aus dem Flag-Feld lesen. Wird eine Ausnahme tatsächlich ausgelöst oder handelt es sich nur um eine Debug-Meldung über eine Ausnahme der ersten Chance (d. H. Intern abgefangen und verarbeitet in der CLR)? Wenn Ersteres, was ist der Stack-Trace der Ausnahme? Erhalten Sie es immer noch, wenn Sie nur Console.WriteLine (kbd.flags)?Sobald Sie sich diese angesehen haben, möchten Sie möglicherweise eine separate Frage erstellen, da diese wahrscheinlich nicht mit der reinen Bit-Twiddling-Frage "Wie verwende ich bitweise Flags in C#?" Verbunden ist, eher ein Marshalling-Problem. – itowlson