2009-11-30 17 views
5
पर वस्तुओं खींचें करने के लिए

मैं अब एक मैकमाउस नीचे क्लिक करने से मैक

void PostMouseEvent(CGMouseButton button, CGEventType type, const CGPoint point) 
{ 
    CGEventRef theEvent = CGEventCreateMouseEvent(NULL, type, point, button); 
    CGEventSetType(theEvent, type); 
    CGEventPost(kCGHIDEventTap, theEvent); 
    CFRelease(theEvent); 
} 

void Click(const CGPoint point) 
{ 
    PostMouseEvent(kCGMouseButtonLeft, kCGEventMouseMoved, point); 
    NSLog(@"Click!"); 
    PostMouseEvent(kCGMouseButtonLeft, kCGEventLeftMouseDown, point); 
    PostMouseEvent(kCGMouseButtonLeft, kCGEventLeftMouseUp, point); 
} 

प्रोग्राम के रूप में पर क्लिक करता है जारी करने के लिए निम्नलिखित कोड का उपयोग कर रहा है, मैं खींचें करने के लिए सक्षम होने के लिए क्लिक करने के लिए नीचे कोशिश कर रहा हूँ ऑब्जेक्ट्स, स्क्रॉल बार या एप्लिकेशन की विंडो की तरह।

PostMouseEvent(kCGMouseButtonLeft, kCGEventMouseMoved, point); 
NSLog(@"Click Down!"); 
PostMouseEvent(kCGMouseButtonLeft, kCGEventLeftMouseDown, point); 

जब मैं कुछ दिलचस्प होगा, जब बाईं माउस नीचे मुद्दा कुछ भी नहीं है इसके बाद के संस्करण कोड चलाने पर क्या लगता है, मैं अपने माउस को स्थानांतरित और खिड़की के लिए कदम नहीं है, लेकिन मैं निम्नलिखित का उपयोग कर रहा जब मैंने माउस ईवेंट जोड़ा तो विंडो उस स्थान पर पहुंची जहां मैंने माना था कि इसे खींच लिया गया था। यह ठीक है, हालांकि, मैं माउस को कैसे क्लिक कर सकता हूं और ऑब्जेक्ट खींच सकता हूं?

नोट: मेरे पास यह देखने के लिए एक पूरी विधि है कि माउस कब चलना बंद कर दिया ताकि मैं क्लिक कर सकूं।

कृपया कोड पोस्ट करें। धन्यवाद

उत्तर

3

क्या आप चाहते हैं एक सक्रिय CGEventTap स्थापित कर रही है kCGEventMouseMoved घटनाओं की एक संपादन योग्य धारा और उन्हें CGEventTap के कॉलबैक में kCGEventLeftMouseDragged घटनाओं में बदलने के लिए (जाहिर है आप पहली बार माउस नीचे घटना के संश्लेषण के लिए की जरूरत है) करने के लिए एक ही रास्ता

आपको लगता है कि यह बिना किसी रिलीज के एक क्लिक ईवेंट भेजकर और माउस को ले जाकर स्वचालित रूप से किया जाता है लेकिन ऐसा नहीं है।

+1

तो, ummm, जैसे, आप इसे कैसे करते हैं, lol। –

+0

CGEventSetType (घटना, kCGEventLeftMouseDragged) – valexa

3

खींचने के लिए, आपको माउस बटन को पहले नीचे रखना होगा, फिर माउस को ले जाएं।

प्रोग्राम आप शायद kCGEventLeftMouseDragged, नहीं kCGEventMouseMoved पोस्ट करना चाहिए, LeftMouseDown और LeftMouseUp घटनाओं के बीच। आप एक कस्टम इवेंट टैप इंस्टॉल कर सकते हैं और इसे सही करने या सही करने के लिए असली माउस ईवेंट लॉग कर सकते हैं।

+1

मैं अभी भी kCGEventLeftMouseDragged का उपयोग करते समय वही व्यवहार देखता हूं। कोई मौका आप मुझे एक स्निपेट दे सकते हैं? मुझे यकीन है कि मैं कुछ गलत कर रहा हूँ। धन्यवाद! – Uri

+1

ठीक है, मैंने CGEventCreateMouseEvent() के साथ एक ईवेंट बनाने का प्रयास किया लेकिन मुझे अभी भी वही व्यवहार दिखाई देता है ... – Uri

+1

कोई भी? किसी का जवाब नहीं है? – Uri

2

हालांकि पीओओबीजेसी में, यह विज्ञापित के रूप में काम करता है। लेकिन यदि आप चाहें तो आप कोको को वापस इंजीनियर कर सकते हैं।

#!/usr/bin/python 
import sys, time 
from Quartz.CoreGraphics import * 

def mouseEvent(type, posx, posy): 
    theEvent = CGEventCreateMouseEvent(None, type, (posx,posy), kCGMouseButtonLeft) 
    CGEventPost(kCGHIDEventTap, theEvent) 

def mousemove(posx,posy): 
    mouseEvent(kCGEventMouseMoved, posx,posy) 

def mouseclickdn(posx,posy): 
    mouseEvent(kCGEventLeftMouseDown, posx,posy) 

def mouseclickup(posx,posy): 
    mouseEvent(kCGEventLeftMouseUp, posx,posy) 

def mousedrag(posx,posy): 
    mouseEvent(kCGEventLeftMouseDragged, posx,posy) 

ourEvent = CGEventCreate(None) 
currentpos = CGEventGetLocation(ourEvent) # Save current mouse position 

mouseclickdn(60, 100) 
mousedrag(60, 300) 
mouseclickup(60, 300) 

time.sleep(1) 
mousemove(int(currentpos.x), int(currentpos.y)) # Restore mouse position 
1

मैं इसे सी में कोको में इस तरह reimplemented है

void mouse_left_click_down_at(float x, float y) { 

      /** 
      * create a new Quartz mouse event. 
      * params: 
      * @source : CGEventSourceRef 
      * @mouseType : CGEventType 
      * @mouseCursorPosition : CGPoint 
      * @mouseButton : CGMouseButton 
     */ 
     CGEventRef left_click_down_event = CGEventCreateMouseEvent(NULL, kCGEventLeftMouseDown, CGPointMake(x, y), 0); 

     /** 
     * post a Quartz event into the event stream at a specified location. 
     * params: 
     * @tap : CGEventTapLocation 
     * @event : CGEventRef 
     */ 
     CGEventPost(kCGHIDEventTap, left_click_down_event); 

     /** 
     * release a Quartz event 
     */ 
     CFRelease(left_click_down_event); 
    } 
    void mouse_left_click_up_at(float x, float y) { 

     /** 
     * create a new Quartz mouse event. 
     * params: 
     * @source : CGEventSourceRef 
     * @mouseType : CGEventType 
     * @mouseCursorPosition : CGPoint 
     * @mouseButton : CGMouseButton 
     */ 
     CGEventRef left_click_up_event = CGEventCreateMouseEvent(NULL, kCGEventLeftMouseUp, CGPointMake(x, y), 0); 

     /** 
     * post a Quartz event into the event stream at a specified location. 
     * params: 
     * @tap : CGEventTapLocation 
     * @event : CGEventRef 
     */ 
     CGEventPost(kCGHIDEventTap, left_click_up_event); 

     /** 
     * release a Quartz event 
     */ 
     CFRelease(left_click_up_event); 
    } 

    void mouse_left_drag_to(float x, float y) { 

     /** 
     * create a new Quartz mouse event. 
     * params: 
     * @source : CGEventSourceRef 
     * @mouseType : CGEventType 
     * @mouseCursorPosition : CGPoint 
     * @mouseButton : CGMouseButton 
     */ 
     CGEventRef left_drag_event = CGEventCreateMouseEvent(NULL, kCGEventLeftMouseDragged, CGPointMake(x, y), 0); 

     /** 
     * post a Quartz event into the event stream at a specified location. 
     * params: 
     * @tap : CGEventTapLocation 
     * @event : CGEventRef 
     */ 
     CGEventPost(kCGHIDEventTap, left_drag_event); 

     /** 
     * release a Quartz event 
     */ 
     CFRelease(left_drag_event); 
    } 

लेकिन मैं एक के बाद यह एक को क्रियान्वित करने के साथ कुछ समस्या का सामना। मैं केवल तभी काम करता हूं जब मैं माउस डाउन, माउस ड्रैग और माउस अप के आमंत्रण के बीच कुछ महत्वपूर्ण देरी जोड़ता हूं।

mouse_left_click_at(400.0, 200.0);   // get focus 
    usleep(10000); 

    mouse_left_click_down_at(400.0, 200.0);  // start dragging 
    usleep(10000); 
    mouse_left_drag_to(500.0, 400.0);   // continue dragging 
    usleep(10000); 
    mouse_left_drag_to(600.0, 500.0); 
    usleep(10000); 
    mouse_left_drag_to(700.0, 600.0); 
    usleep(10000); 
    mouse_left_drag_to(800.0, 700.0); 
    usleep(10000); 
    mouse_left_click_up_at(800.0, 700.0);  // stop dragging 
संबंधित मुद्दे