2011-04-30 11 views
8

मैं एक कुंजीपटल हुक स्थापित किया है:उपयोगकर्ता द्वारा टैप किए गए कीबोर्ड ईवेंट और जेनरेट किए गए एक के बीच अंतर कैसे बताना है?

CGEventRef myCGEventCallback(CGEventTapProxy proxy, CGEventType type, CGEventRef event, void *refcon) {

असल में मैं उपयोगकर्ता के कीबोर्ड नल ले, इनपुट खाते हैं, और अपने खुद के इनपुट पोस्ट के बजाय करना चाहते हैं।

तो यदि वह "जी" टैप करता है तो मैं टेक्स्टफील्ड में "foo" पोस्ट करना चाहता हूं। http://www.mail-archive.com/[email protected]/msg23343.html

समस्या यह है कि मेरी प्रोग्राम के रूप में दर्ज की गई पात्रों में से प्रत्येक कुंजीपटल हुक मार जाता है:

मैं यहां पाया के रूप में पाठ फ़ील्ड के लिए लिख रहा हूँ CGEventPost और CGEventSetUnicodeString साथ। इसलिए मैं उपयोगकर्ता इनपुट को अवरुद्ध करने के लिए कीबोर्ड हुक में return NULL नहीं कर सकता ... जो सभी प्रोग्राम के इनपुट को भी अवरुद्ध करता है! ऑब्जेक्टिव-सी में कुछ इसी तरह के लिए खोज रहे How do I use low-level 8 bit flags as conditionals?

:

मैं उन्हें 'इंजेक्शन' ध्वज के साथ सी # में Windows पक्ष पर विभेदित, मेरे सवाल का एक साल पहले यहां देखें।

उत्तर

6

CGEventSource.h में टिप्पणियों पर नज़र डालें। Event Services Reference का उपयोग करने से जानकारी को एकसाथ रखना थोड़ा आसान है। लंबे समय तक है, लेकिन अधिक सही, जिस तरह से चारों ओर लगता है कि creating an event source (जो स्मृति प्रबंधन नियमों के अधीन है, तुम इसे यदि आप इस कार्यक्रम समाप्ति से पहले उपयोग समाप्त होते CFRelease करने की जरूरत है):

myEventSource = CGEventSourceCreate(kCGEventSourceStatePrivate); 

यह अपनी खुद की पैदा करेगा एक अद्वितीय आईडी के साथ निजी घटना स्रोत; आप तो संकेत मिलता है घटनाओं वहां बनाएंगे, वे से आया है कि:

if((CGEventGetType(newEvent) == kCGEventKeyDown) && 
    (CGEventGetIntegerValueField(newEvent, kCGEventSourceStateID) == CGEventSourceGetSourceStateID(myEventSource)) { 

भी स्रोत आप पारित देता है कि के लिए एक user data field नहीं है:

CGEventRef myKeyboardEvent = CGEventCreateKeyboardEvent(myEventSource, 
                 keyCode, true); 

जब कोई ईवेंट में आता है, अगर यह अपने आप से देखने के लिए जाँच एक मनमानी 64 बिट्स के आसपास, आपको इसकी आवश्यकता होनी चाहिए।

त्वरित और गंदी तरह से एक घटना क्षेत्र है कि kCGMouseEventPressure की तरह, एक कुंजीपटल घटना के लिए एक सार्थक मूल्य हो सकता है और यह एक हस्ताक्षर में बदलने की संभावना नहीं है उठा कोशिश करने के लिए होगा:

CGEventSetIntegerValueField(myKeyboardEvent, 
          kCGMouseEventPressure, 
          0xFEEDFACE); 
// The field is an int_64 so you could make the sig longer 
+0

हम्म, जैसा कि दिखाया गया है MouseEventPressure के 'त्वरित और गंदे' संपादन मुझे निम्नलिखित प्रदान कर रहा है: kCGErrorIllegalArgument: CGEventSetIntegerValueField: अमान्य घटना – cksubs

+0

@cksubs: क्या आपने ईवेंट स्रोत के लिए उपयोगकर्ता डेटा फ़ील्ड का उपयोग करके वास्तविक तरीके का प्रयास किया था? –

+0

मैं उस रात को एक और नजर रखूंगा। मैं उस समय अटक गया जब मैंने मूल रूप से सवाल पूछा लेकिन इस समय क्यों याद नहीं किया जा सकता। क्या आपके पास उस त्रुटि पर कोई विचार है? http://stackoverflow.com/questions/7102883/using-cgeventsetintegervaluefield-to-edit-a-keyboard-event-gives-error – cksubs

संबंधित मुद्दे