2010-03-03 17 views
7

मै मैक ओएस एक्स 10.6 और बाद में सी ++ में एक एप्लीकेशन लिख रहा हूं। एप्लिकेशन के एक हिस्से में माउस आंदोलन और माउस क्लिक अनुकरण करने की आवश्यकता है। मैं वर्तमान में CGEventPost(kCGHIDEventTap, event); का उपयोग कर CGEvent ऑब्जेक्ट्स पोस्ट करके ऐसा करता हूं।मैक ओएस एक्स पर माउस क्लिक को सिम्युलेट करना कुछ अनुप्रयोगों के लिए काम नहीं करता

यह काम करता है, अधिकांश भाग के लिए - मैं माउस आंदोलन अनुकरण कर सकते हैं और ठीक क्लिक करता है, लेकिन यह कुछ क्षेत्रों में असफल रहा है। उदाहरण के लिए:

  • मोज़िला फ़ायरफ़ॉक्स और सफारी में, मैं सभी मेनू पर क्लिक कर सकता हूं, लेकिन किसी वेबसाइट के भीतर किसी लिंक पर क्लिक नहीं कर सकता। जब मैं कोशिश करता हूं, लिंक हाइलाइट किया जाता है, लेकिन ब्राउजर लिंक का पालन नहीं करता है। हालांकि, मैं एक लिंक पर राइट-क्लिक कर सकता हूं, "नए टैब में लिंक खोलें" का चयन करें, और सब कुछ अपेक्षित काम करता है। हल - CGEventCreateMouseEvent(...) का उपयोग कर माउस ईवेंट बनाना, ईवेंट को वेब ब्राउज़र के भीतर काम करता है।
  • मैं डैशबोर्ड को ब्रिंक करने के लिए "डैशबोर्ड" आइकन पर क्लिक कर सकता हूं, लेकिन मैं किसी भी डैशबोर्ड विजेट पर "i" बटन पर क्लिक नहीं कर सकता। इसी प्रकार, स्पॉटलाइट खोज विजेट से किसी भी खोज परिणामों पर क्लिक करना या तो काम नहीं करता है।

इस असंगति आवेदन सीमाओं के साथ है। कारण क्या हो सकता है?

उत्तर

5

इन अनुप्रयोगों को समझाने के लिए आपको क्या करना है, जो वास्तव में एक क्लिक उत्पन्न करते हैं, माउस अप ईवेंट पर "क्लिक स्टेट" फ़ील्ड के मान को स्पष्ट रूप से सेट करने के लिए 1 (यह 0 से डिफ़ॉल्ट) है। निम्नलिखित कोड यह करना होगा:

CGEventSetIntegerValueField(event, kCGMouseEventClickState, 1); 

यह भी नीचे माउस के लिए 1 पर सेट किया जाना है, लेकिन) CGEventCreateMouseEvent (का उपयोग करके नहीं बल्कि CGEventCreate() है कि आप के लिए किया जाता है।

मैंने इसका परीक्षण किया है और यह डैशबोर्ड और स्पॉटलाइट खोज परिणामों में 'i' बटन में काम करता है।

(एक अलग रूप में के रूप में, यदि आप एक डबल का अनुकरण कर रहे थे तुम दोनों नीचे माउस और माउस ऊपर दूसरा क्लिक की घटनाओं के लिए 2 के लिए क्लिक राज्य स्थापित करने के लिए की आवश्यकता होगी क्लिक करें।)

+0

शानदार! यह पूरी तरह हल हो गया। आपका बहुत बहुत धन्यवाद! – Thomi

0

OSXVnc का उपयोग करें। मुझे लगता है कि वे CGPostEvent() के बजाय CGPostMouseEvent() का उपयोग करते हैं।

+1

CGPostMouseEvent को 10.6 में बहिष्कृत कर दिया गया है। सुझाव के लिए धन्यवाद, लेकिन मैं बदले गए कार्यों का उपयोग नहीं करना चाहूंगा। – Thomi

+2

CGPostMouseEvent() को CGEventCreateMouseEvent() के साथ बदल दिया गया है। इसका उपयोग क्यों नहीं करें? http://developer.apple.com/mac/library/documentation/Carbon/Reference/QuartzEventServicesRef/Reference/reference.html#//apple_ref/c/func/CGEventCreateMouseEvent – Taybin

+0

CGEventCreate() से CGEventCreateMouseEvent() में बदलना है फ़ायरफ़ॉक्स समस्या को ठीक किया गया - whcih अजीब है, मैं सभी के बाद एक ही पैरामीटर सेट कर रहा हूं, लेकिन डैशबोर्ड समस्या नहीं। – Thomi

1

अधिकांश मेनू माउसडाउन ईवेंट के साथ सक्रिय होते हैं। माउसअप ईवेंट के बाद हाइपरलिंक्स का पालन किया जाता है। "I" बटन केवल तभी काम करता है जब माउस क्लिक किया गया हो लेकिन लंबे समय तक नहीं। यह सब दिखाना प्रतीत होता है कि आपके पास समय की समस्या है, कई दबाए गए समयों को आजमाएं।

+0

यह एक आशाजनक लीड की तरह लगता है। मैंने माउस को नीचे और माउस अप घटनाओं के बीच अंतर का समय दिया है - एक सामान्य क्लिक 42 एमएस लेता है, जो मुझे लगता है कि क्लिक-एंड-होल्ड या किसी भी चीज़ के बजाय एक क्लिक ईवेंट उत्पन्न करने के लिए पर्याप्त छोटा होना चाहिए ... – Thomi

+0

दरअसल, यह एक समय मुद्दा नहीं है। जब तक आप क्लिक गिनती सेट करते हैं, तब तक कोई उचित समय होगा। –

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