2010-11-24 7 views
4

ctypes.windll.user32.mouse_event(3、0、0、0、0)のctypes mouse_events

私は、マウスの位置をいじり、私は理解して何からマウスをエミュレートし、このラインにつまずいていますクリック。誰かが同様の行(右クリックなど)のドキュメントを持っていますか?

答えて

9

私はマウスの管理を包む小さなクラスを持っています。ここで

import win32gui, win32api, win32con, ctypes 

class Mouse: 
    """It simulates the mouse""" 
    MOUSEEVENTF_MOVE = 0x0001 # mouse move 
    MOUSEEVENTF_LEFTDOWN = 0x0002 # left button down 
    MOUSEEVENTF_LEFTUP = 0x0004 # left button up 
    MOUSEEVENTF_RIGHTDOWN = 0x0008 # right button down 
    MOUSEEVENTF_RIGHTUP = 0x0010 # right button up 
    MOUSEEVENTF_MIDDLEDOWN = 0x0020 # middle button down 
    MOUSEEVENTF_MIDDLEUP = 0x0040 # middle button up 
    MOUSEEVENTF_WHEEL = 0x0800 # wheel button rolled 
    MOUSEEVENTF_ABSOLUTE = 0x8000 # absolute move 
    SM_CXSCREEN = 0 
    SM_CYSCREEN = 1 

    def _do_event(self, flags, x_pos, y_pos, data, extra_info): 
     """generate a mouse event""" 
     x_calc = 65536L * x_pos/ctypes.windll.user32.GetSystemMetrics(self.SM_CXSCREEN) + 1 
     y_calc = 65536L * y_pos/ctypes.windll.user32.GetSystemMetrics(self.SM_CYSCREEN) + 1 
     return ctypes.windll.user32.mouse_event(flags, x_calc, y_calc, data, extra_info) 

    def _get_button_value(self, button_name, button_up=False): 
     """convert the name of the button into the corresponding value""" 
     buttons = 0 
     if button_name.find("right") >= 0: 
      buttons = self.MOUSEEVENTF_RIGHTDOWN 
     if button_name.find("left") >= 0: 
      buttons = buttons + self.MOUSEEVENTF_LEFTDOWN 
     if button_name.find("middle") >= 0: 
      buttons = buttons + self.MOUSEEVENTF_MIDDLEDOWN 
     if button_up: 
      buttons = buttons << 1 
     return buttons 

    def move_mouse(self, pos): 
     """move the mouse to the specified coordinates""" 
     (x, y) = pos 
     old_pos = self.get_position() 
     x = x if (x != -1) else old_pos[0] 
     y = y if (y != -1) else old_pos[1]  
     self._do_event(self.MOUSEEVENTF_MOVE + self.MOUSEEVENTF_ABSOLUTE, x, y, 0, 0) 

    def press_button(self, pos=(-1, -1), button_name="left", button_up=False): 
     """push a button of the mouse""" 
     self.move_mouse(pos) 
     self._do_event(self.get_button_value(button_name, button_up), 0, 0, 0, 0) 

    def click(self, pos=(-1, -1), button_name= "left"): 
     """Click at the specified placed""" 
     self.move_mouse(pos) 
     self._do_event(self._get_button_value(button_name, False)+self._get_button_value(button_name, True), 0, 0, 0, 0) 

    def double_click (self, pos=(-1, -1), button_name="left"): 
     """Double click at the specifed placed""" 
     for i in xrange(2): 
      self.click(pos, button_name) 

    def get_position(self): 
     """get mouse position""" 
     return win32api.GetCursorPos() 

は小さな一例です:

import time 
mouse = Mouse() 
mouse.click((20, 10), "left") 
time.sleep(2.0) 

mouse.click((100, 100), "right") 

私はそれがこれがhttp://blog.lazynice.net/?p=63からである

+0

あなただけのマウスの位置を照会するために 'win32api'を使用している場合は、[あなたがctypesの中にそれを行うことができます](http://pastebin.com/P2SYvZYc)。 – DuckPuncher

+1

_do_eventの部分が機能せず、65536Lがエラーを返します。 –

+0

おそらく手遅れですが、私はLを取り除き、x_calcとy_calcをintにキャストしなければなりませんでした。その後、それは働いた:D –

4

に役立ちます願っています。

スクリプトは毎分ウィンドウの非アクティブを検出します。非アクティブが5分を超えると、マウスを少し動かすマウスイベントが送信されるだけなので、スクリーンセーバーはユーザーの入力から来たと考えて、タイマーをリセットします。非アクティブ期間をスクリーンセーバーの待機時間より短く設定してから実行してください!

from ctypes import Structure, windll, c_uint, sizeof, byref 
import time 

class LASTINPUTINFO(Structure): 
    _fields_ = [('cbSize', c_uint), ('dwTime', c_uint)] 

def get_idle_duration(): 
    lastInputInfo = LASTINPUTINFO() 
    lastInputInfo.cbSize = sizeof(lastInputInfo) 
    windll.user32.GetLastInputInfo(byref(lastInputInfo)) 
    millis = windll.kernel32.GetTickCount() – lastInputInfo.dwTime 
    return millis/1000.0 

while True: 
    d = get_idle_duration() 
    if d > 60 * 5: 
     windll.user32.mouse_event(1, 1, 1, 0, 0) 
    time.sleep(60) 
+0

...またはあなたのスクリーンセーバーを無効に... –

+1

これはあなたのスクリーンセーバーの笑を無効にするよりもはるかに優れている – Inversus

関連する問題