के साथ उपभोग करना मैं अपने जादू ट्रैकपैड से ईवेंट को सक्षम/अक्षम करने के लिए एक ईवेंट जाल जोड़ने की कोशिश कर रहा हूं। मैंने सोचा कि यह सीधे आगे होगा, यानी एक घटना जाल पंजीकृत करें और जब आवश्यक हो, तो NULL
लौटकर ईवेंट को त्यागें। विचार कुछ विशिष्ट, समय लेने वाली डेटा एंट्री के लिए पैड का उपयोग करना है, डेटा में प्रवेश करने के लिए एप्लिकेशन तीसरे पक्ष के हैं इसलिए मैं चाहता हूं कि मैं चाहता हूं कि मैं चाहता हूं कि कोड न जोड़ें। तो मैंने सोचा कि मैं सिस्टम घटनाओं की निगरानी करता हूं और फिर CGEventCreateKeyboardEvent
एस के गुच्छा के माध्यम से वांछित इनपुट भेजता हूं।ओएसएक्स माउस/ट्रैकपैड घटनाओं को एक ईवेंट टैप
समस्या वापस आ रही है, घटनाओं को त्यागना प्रतीत नहीं होता है, थोड़ा और जांच से पता चलता है कि यह ट्रैकपैड से आने वाले लोगों तक ही सीमित नहीं है बल्कि मेरा डिफ़ॉल्ट यूएसबी माउस भी प्रतिबंधित है।
मेरा कोड नीचे है। नीचे क्या है, मैं उम्मीद करता हूं कि माउस को स्थानांतरित करने में सक्षम न होने की उम्मीद है, अगर मैं kCGEventScrollWheel
या kCGEventLeftMouseDragged
का उपयोग करने के लिए (ए) बदलता हूं तो ईवेंट का उपभोग होता है, यानी स्क्रॉलिंग या बाएं बीटीएन ड्रैग नहीं होता है। क्या इसका मतलब यह है कि सभी घटनाओं को त्याग दिया नहीं जा सकता है? उम्मीद है कि मैं सिर्फ यहाँ कुछ स्पष्ट याद कर रहा हूँ
#define case_print(a) case a: printf("%s - %d\n",#a,a); break;
CGEventRef eventOccurred(CGEventTapProxy proxy, CGEventType type, CGEventRef event, void* refcon) {
int subType = CGEventGetIntegerValueField(event, kCGMouseEventSubtype);
if (type == NSEventTypeGesture || subType == NX_SUBTYPE_MOUSE_TOUCH) {
printf("touchpad\n");
switch(type) {
case_print(kCGEventNull)
case_print(kCGEventLeftMouseDown)
case_print(kCGEventLeftMouseUp)
case_print(kCGEventRightMouseDown)
case_print(kCGEventRightMouseUp)
case_print(kCGEventMouseMoved)
case_print(kCGEventLeftMouseDragged)
case_print(kCGEventRightMouseDragged)
case_print(kCGEventScrollWheel)
case_print(kCGEventOtherMouseDown)
case_print(kCGEventOtherMouseUp)
case_print(kCGEventOtherMouseDragged)
case_print(kCGEventTapDisabledByTimeout)
case_print(kCGEventTapDisabledByUserInput)
case_print(NSEventTypeGesture)
case_print(NSEventTypeMagnify)
case_print(NSEventTypeSwipe)
case_print(NSEventTypeRotate)
case_print(NSEventTypeBeginGesture)
case_print(NSEventTypeEndGesture)
default:
printf("default: %d\n",type);
break;
}
event = NULL;
} else {
if (type == kCGEventMouseMoved) { // (A)
printf("discarding mouse event");
event = NULL;
}
}
return event;
}
CFMachPortRef createEventTap() {
CGEventMask eventMask = NSAnyEventMask;
if (!AXAPIEnabled() && !AXIsProcessTrusted()) {
printf("axapi not enabled");
}
return CGEventTapCreate(kCGHIDEventTap,
kCGHeadInsertEventTap,
kCGEventTapOptionDefault,
eventMask,
eventOccurred,
NULL);
}
int main (int argc, const char * argv[]) {
CFMachPortRef tap = createEventTap();
if (tap) {
CFRunLoopSourceRef rl = CFMachPortCreateRunLoopSource(kCFAllocatorDefault, tap, 0);
CFRunLoopAddSource(CFRunLoopGetMain(), rl, kCFRunLoopCommonModes);
CGEventTapEnable(tap, true);
CFRunLoopRun();
printf("Tap created.\n");
sleep(-1);
} else {
printf("failed!\n");
}
return 0;
}
ध्यान दें, "axapi सक्षम नहीं" उत्पादन हालांकि मुझे नहीं लगता पहुंच विकल्प कुछ भी लेकिन कुंजीपटल की घटनाओं को प्रभावित करता है नहीं है।
बीटीडब्ल्यू, मैंने टच पैड से घटनाओं को कैसे प्राप्त किया है, इस पर कुछ समान पोस्ट देखी हैं, उन्हें छोड़ने के लिए कुछ भी लागू नहीं है (शून्य को वापस करने के अलावा काम करना चाहिए)।
क्यों इस उत्तर के रूप में चिह्नित किया गया था? क्या आप प्रोजेक्ट से माउस ईवेंट को रोकने में सक्षम थे? मैं मुख्य घटनाओं को रोकने में सक्षम हूं, लेकिन माउस आंदोलनों नहीं ... – cksubs