2009-11-30 7 views
5

上のオブジェクトをドラッグするには、下にマウスをクリックする私はMac上でプログラム的にクリックを発行するために、次のコードを使用してきたマック

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

(明らかにあなたが最初のマウスダウンイベントを合成する必要がある)何がkCGEventMouseMovedイベントの編集可能なストリームを取得し、CGEventTapのコールバックでkCGEventLeftMouseDraggedイベントにそれらを変更するには、アクティブCGEventTapを設定されたい行う唯一の方法

これは、リリースがなくマウスを動かすというクリックイベントを送信することによって自動的に行われると考えられますが、そうではありません。

+1

だから、そうですね、どうしますか、笑。 –

+0

CGEventSetType(イベント、kCGEventLeftMouseDragged) – valexa

3

ドラッグするには、まずマウスボタンを押した後にマウスを移動する必要があります。プログラム

、あなたはおそらくLeftMouseDownLeftMouseUpイベントの間、kCGEventLeftMouseDragged、ないkCGEventMouseMovedを投稿する必要があります。カスタムイベントタップをインストールし、実際のマウスイベントを記録してこれを確認または修正することができます。

+1

kCGEventLeftMouseDraggedを使用しても同じ動作が表示されます。 私にスニペットを教えてもらえますか?私は何か間違っていると確信しています。ありがとう! – Uri

+1

私はCGEventCreateMouseEvent()でイベントを作成しようとしましたが、まだ同じ動作が表示されています... – Uri

+1

誰か?誰も答えはありませんか? – Uri

2

PyObjCでは、これは広告として動作しますが、しかし、あなたが望むなら、それをCocoaにリバースエンジニアリングすることができます。

#!/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

私はCにココアでそれをこのように再実装している:

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 
関連する問題