1. 程式人生 > >pyobjc實現滑鼠事件模擬(Mac)

pyobjc實現滑鼠事件模擬(Mac)

既然pyobjc能夠使用cocoa提供的這麼多庫函式,那對我們有沒有一些實際的作用呢?聯想到在自動化測試中,appscript有些操作目前還是無法實現的,例如:

無法實現點選螢幕任意座標(appscript中未找到類似的api)

無法雙擊某個控制元件(通過appscript兩次呼叫控制元件的click方法是不生效的)

無法實現控制元件上右鍵……

現在,這些appscript無法完成的操作,通過pyobjc又找到了另一條實現的途徑,我們可以藉助pyobjc,來構造並觸發我們需要的滑鼠事件,cocoa的 CoreGraphics庫中就包含了構造所有滑鼠事件的方法,在蘋果開發者網站上了解了這些函式的使用方式後,實現一個fakemouse,能否完成的操作有:點選螢幕任意座標、在任意座標雙擊、在任意座標滑鼠右鍵、移動滑鼠至某個座標、滑鼠拖拽等。具體實現程式碼如下:

#!/usr/bin/python
'''
Created on 2013-8-30

@author: maricoliu
'''
import sys
import 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 mouseClickDown(posx, posy):
    _mouseEvent(kCGEventLeftMouseDown, posx, posy)
    
def mouseClickUp(posx, posy):
    _mouseEvent(kCGEventLeftMouseUp, posx, posy)
    
def mouseDrag(posx, posy):
    _mouseEvent(kCGEventLeftMouseDragged, posx, posy)
    
def mouseClick(posx, posy):
    '''perform a left click'''
    _mouseEvent(kCGEventLeftMouseDown, posx, posy)
    _mouseEvent(kCGEventLeftMouseUp, posx, posy)
    
def mouseRightClick(posx, posy):
    theEvent = CGEventCreateMouseEvent(None, kCGEventRightMouseDown, (posx,posy), kCGMouseButtonRight)
    CGEventPost(kCGHIDEventTap, theEvent)
    theEvent2 = CGEventCreateMouseEvent(None, kCGEventRightMouseUp, (posx,posy), kCGMouseButtonRight)
    CGEventPost(kCGHIDEventTap, theEvent2)

def mouseDoubleClick(posx, posy):
    '''perfrom a double left click'''
    theEvent = CGEventCreateMouseEvent(None, kCGEventLeftMouseDown, (posx,posy), kCGMouseButtonLeft);  
    CGEventPost(kCGHIDEventTap, theEvent);  
    CGEventSetType(theEvent, kCGEventLeftMouseUp);  
    CGEventPost(kCGHIDEventTap, theEvent); 
    CGEventSetIntegerValueField(theEvent, kCGMouseEventClickState, 2);   
    CGEventSetType(theEvent, kCGEventLeftMouseDown);  
    CGEventPost(kCGHIDEventTap, theEvent);  
    CGEventSetType(theEvent, kCGEventLeftMouseUp); 
    CGEventPost(kCGHIDEventTap, theEvent);

def mouseScroll(movement=30, direction=1):  
    '''
    @param movement: lines to scroll, Integer 



    @param direction: scroll up or scroll down, 1:scroll up, -1:scroll down 
    '''      
    for i in range(movement):
        theEvent = CGEventCreateScrollWheelEvent(None, kCGScrollEventUnitLine, 1, direction)
        CGEventPost(kCGHIDEventTap, theEvent)
        time.sleep(0.02)       
    #CGPostScrollWheelEvent(1, 5)


if __name__ == '__main__':
    ourEvent = CGEventCreate(None);
    currentpos=CGEventGetLocation(ourEvent); # Save current mouse position
    time.sleep(1);

    for i in range(20):
        mouseScroll(40, 1)
        mouseScroll(40, -1)
    
    # mouseclick(1610, 215)
    # mousedoubleclick(1697, 561)
    time.sleep(1);
    #mouseMove(int(currentpos.x),int(currentpos.y)); # Restore mouse position

 

相關推薦

pyobjc實現滑鼠事件模擬Mac

既然pyobjc能夠使用cocoa提供的這麼多庫函式,那對我們有沒有一些實際的作用呢?聯想到在自動化測試中,appscript有些操作目前還是無法實現的,例如: 無法實現點選螢幕任意座標(appscript中未找到類似的api) 無法雙擊某個控制元件(通過appscript

MATLAB滑鼠事件應用記錄

前記:      人機互動的方式--鍵盤開關、滑鼠、觸控式螢幕、體感感測器(Kinect、leap motion)等的使用大大促進人與機器的交流過程。這裡記錄滑鼠事件與MATLAB的結合,為後期機器人模擬控制打下基礎---如滑鼠直接拖動機器人運動(像很多機器人模擬軟體裡的作用

事件同步-——CreateEvent( )事件對象實現線程同步

reat strong 系統 col 線程等待 對象 span create 多個 ## 事件對象分為兩類:人工重置事件對象和自動重置事件對象。 對於人工重置事件對象,可以同時有多個線程等待到事件對象,成為可調度線程。 對於自動重置事件對象,等待該事件對象的多個線程只

quartusii 使用ModelSim do檔案實現模擬Verilog

QuartusII從9.1之後的版本都已經取消了內部自帶的模擬器,都需要藉助第三方模擬軟體比如Modelsim才能實現模擬。一般在進行程式碼編寫的時候,如果結合功能模擬,可以很快的驗證程式碼實現的邏輯是否滿足要求。所以熟練使用Modelsim也是邏輯工程師必須掌握的一個技能。由於Modelsim可以支援命令

JAVA實現EXCEL公式專題——字符串函數

main 問題 int start boolean java ... ringbuf out substring 直接上代碼:/** * 項目名稱: * 文件說明: ExCEL公式類型:字符串公式 * 主要特點: * 版本:1.0 * 制作人:劉晨曦

使用OpenCL+OpenCV實現圖像旋轉

posit 段落 大致 pro 什麽 string cpp base wechat [題外話]近期申請了一個微信公眾號:平凡程式人生。有興趣的朋友可以關註,那裏將會涉及更多更新OpenCL+OpenCV以及圖像處理方面的文章。 最近在學習《OPENCL異構計算》,其中有

js window事件解析轉載

slow disable forward 建立 多選 1.0 參數 小程序 距離 js-window對象的方法和屬性資料 hxpd 發表於 2007-05-08 21:58:18 熟練window對象的open、close、alert、confirm、prompt、setT

事件處理

blog lis 監聽 上下 strong 單擊 長按 view 處理方法 事件處理步驟: 1.註冊事件監聽器 2.根據指定的事件中編寫事件處理的代碼 3.在事件處理的代碼證完成對事件的處理 事件處理方法 1.setOnClickListener(View.OnC

神奇數--全國模擬

iostream 情況 時間限制 ont space 1.8 範圍 height clu [編程題] 神奇數 時間限制:1秒 空間限制:32768K 給出一個區間[a, b],計算區間內“神奇數”的個數。 神奇數的定義:存在不同位置的兩個數位,組成一個兩位數(且不含前導0)

訓練部隊--全國模擬

urn 獲得 訓練 描述 font 限制 nbsp 發生 ear [編程題] 訓練部隊 時間限制:1秒 空間限制:32768K 小牛牛是牛牛王國的將軍,為了訓練出精銳的部隊,他會對新兵進行訓練。部隊進入了n個新兵,每個新兵有一個戰鬥力值和潛力值,當兩個新兵進行決鬥時,總是戰

使用Struts2和jQuery EasyUI實現簡單CRUD系統——jsp,json,EasyUI的結合

元素 word cli resultset sheet 傳輸 charset {} tco 這部分比較復雜,之前看過自己的同學開發一個選課系統的時候用到了JSON,可是一直不知道有什麽用。寫東西也沒用到。所以沒去學他。然後如今以這樣的懷著好奇心,這是做什麽用的,這是怎麽用

Android實現音樂播放器

simple ani call ket 打開文件 界面 方式 .cn 點擊 Graphical User Interface 本篇文章記錄了我實現Android簡單音樂播放器的過程,(一)中介紹了怎麽構建音樂播放器的前端頁面。首先大家看一下,界面最後是這樣的(界面有

添加字符--全國模擬

思路 namespace max brush 開頭 res == stream clas [編程題] 添加字符 時間限制:1秒 空間限制:32768K 牛牛手裏有一個字符串A,羊羊的手裏有一個字符串B,B的長度大於等於A,所以牛牛想把A串變得和B串一樣長,這樣

5、醜陋的字符串--全國模擬

結束 改變 style div -h weight -c cout mes [編程題] 醜陋的字符串 時間限制:1秒 空間限制:32768K 牛牛喜歡字符串,但是他討厭醜陋的字符串。對於牛牛來說,一個字符串的醜陋值是字符串中相同連續字符對的個數。比如字符串“ABABAABB

1、黑白卡片--全國模擬

第一個 存在 編程 mes col 1.8 != 整數 解題思路 [編程題] 黑白卡片 時間限制:1秒 空間限制:32768K 牛牛有n張卡片排成一個序列.每張卡片一面是黑色的,另一面是白色的。初始狀態的時候有些卡片是黑色朝上,有些卡片是白色朝上。牛牛現在想要把一些卡片翻過

1、黑化的牛牛--全國模擬

size clas bold urn 解題思路 -a 限制 namespace fun [編程題] 黑化的牛牛 時間限制:1秒 空間限制:32768K 牛牛變得黑化了,想要摧毀掉地球。但他忘記了開啟地球毀滅器的密碼。牛牛手裏有一個字符串S,牛牛還記得從S中去掉一個字符就恰好

3、膨脹的牛牛--全國模擬

style 包括 ios ria stream 包含 cnblogs 全國 cout [編程題] 膨脹的牛牛 時間限制:1秒 空間限制:32768K 牛牛以草料為食。牛牛有一天依次遇到n堆被施展了魔法的草料,牛牛只要遇到一堆跟他當前相同大小的草料,它就會把草料吃完,而使自己

不用寫Windows服務實現定時器功能FluentScheduler

ace 簡單 要去 job macbook sharp 管理 dia 做到 MacBook Pro 只有四個 USB Type-C 接口是否錯了? 一項新技術的誕生總會對已存在的事物造成沖擊或影響,如果大家都害怕沖擊與影響,那這個世界永遠像現在不變就行了,大家都好好的,待

【SSH進階之路】Struts基本原理 + 實現簡單登錄

target doctype 掌握 pack insert enter snippet file manage 上面博文,主要簡單的介紹了一下SSH的基本概念,比較宏觀。作為剛開始學習的人可以有一個總體上的認識,個人覺得對學習有非常好的輔助功能,它不不過

android事件分發

sim tdi p s oat front rac ram addclass framework 非常早之前寫過一篇android事件分發的博客,主要寫的是它是怎樣分發的,具體非常多原理的東西都沒有涉及到。今天就從源代碼看android怎樣控制它的分發機