2010-01-16 5 views
6

मेरे कीबोर्ड हुक में, प्रत्येक कीप्रेस को ध्वज मिलता है जो बताता है कि यह इंजेक्शन दिया गया था या नहीं। http://msdn.microsoft.com/en-us/library/ms644967(VS.85).aspxमैं कम-स्तर 8 बिट झंडे को सशर्त के रूप में कैसे उपयोग करूं?

मैंने एलपीराम से एक KBDLLHOOKSTRUCT को आसवित किया है। मैं 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) {... 

चीयर्स!

उत्तर

7

आपको थोड़ा सा-और मास्क के साथ इसकी आवश्यकता है। उदाहरण के लिए, इंजेक्शन बिट बिट 4 है। यह बाइनरी 00010000 है, हेक्स 0x10। अगर कुछ के बाएं तो तुम बिटवाइज़-और यह 0x10 के साथ, और देखें:

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

(बेशक, एंड्रयू जवाब के अनुसार, यह एक अच्छा विचार इस के लिए एक LLKHF_INJECTED लगातार परिभाषित करने के लिए किया जाएगा बल्कि हेक्स मान सहित से ! अपने कोड में सीधे)

+0

यह (और यहाँ दूसरों है कि मैं कोशिश की है) 'टाइप का पहला मौका अपवाद' सिस्टम फेंक रहा है। ऑर्ग्यूमेंट एक्सेप्शन 'foofoo.exe' में हुआ है, जैसा कि मैंने पिछले कीबोर्ड हुक कोड को भी गड़बड़ कर लिया है। क्या देता है? यह संकलन भी नहीं कर रहा है जब तक कि मैं कोष्ठक नहीं जोड़ता: 'bool isInjected = ((kbd.flags & LLKHF_INJECTED)! = 0);' ... क्या यह कोड बदल रहा है? – cksubs

+0

अतिरिक्त माता-पिता कोड नहीं बदल रहे हैं - वे बस मेरी मूर्खतापूर्ण प्राथमिकता त्रुटि को ठीक करते हैं। उत्तर अपडेट किया गया। – itowlson

+0

कोई विचार नहीं है कि ArgumentException कहां से आ रहा है, क्योंकि आप केवल झंडे के मैदान से पढ़ रहे हैं। क्या वास्तव में एक अपवाद फेंक दिया जा रहा है या क्या यह पहली मौका अपवाद के बारे में एक डीबग संदेश है (यानी सीएलआर के भीतर आंतरिक रूप से पकड़ा और संभाला जाता है)? यदि पूर्व, अपवाद का स्टैक ट्रेस क्या है? क्या आप अभी भी इसे प्राप्त करते हैं यदि आप केवल कंसोल। राइटलाइन (kbd.flags)?एक बार जब आप इन्हें देख लेते हैं, तो हो सकता है कि आप एक अलग प्रश्न बनाना चाहें क्योंकि यह शायद शुद्ध बिट-ट्विडलिंग प्रश्न से संबंधित नहीं है "मैं सी # में बिटवाई झंडे का उपयोग कैसे करूं?", अधिक संभावना है कि एक मार्शलिंग मुद्दा। – itowlson

3

अगर प्रासंगिक बिट झंडे चर में सेट किया गया है की जाँच करने के बिटवाइज़ AND ऑपरेटर का उपयोग करें:

if (kbd.flags & LLKHF_INJECTED) 
{ 
    ... 
} 
+0

संकलित नहीं होगा। सी # में, 'अगर' अभिव्यक्ति एक बूल होना चाहिए; kbd.flags और LLKHF_INJECTED एक int है। (हालांकि यह सी/सी ++ में काम करेगा।) – itowlson

2

आपको यह देखना होगा कि bitflag सेट किया गया है की जरूरत है। Bitwise संचालन के साथ करना आसान है। प्रलेखन में कहा गया है कि बिट चार इंजेक्शन ध्वज के लिए उपयोग किया जाता है, बिट 4 (या 5 यदि आप पहले बिट को 1 के रूप में गिनते हैं) 16 के बराबर है, तो आप थोड़ा सा और ध्वज के खिलाफ कर सकते हैं।

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

आप यहाँ बिटवाइज़ संचालन के बारे में अधिक सीख सकते हैं:

+1

बिट 4 बराबर 16 (बिट 4 पांचवीं बिट है, जो 0 से 7 तक गिनती है) – LukeH

+0

अच्छी कॉल, यह नहीं देखा कि वे दस्तावेज़ों में शून्य अनुक्रमित थे। – Skurmedel

11

नेट [झंडे] विशेषता के साथ इस का समर्थन करता है:

[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.. 
    } 
2

कारण हर कोई एक बिटवाइज़ & उपयोग करने के लिए और फिर झंडा शून्य करने के लिए की तुलना या कह रहा है:

0111 1000  // kbd.flags 
& 0001 0000  // Injected 
      = 
    0001 0000  // (!= 0 or ==Injected) 
संबंधित मुद्दे