2010-06-03 13 views
5

मान लें कि मुझे एक खिड़की मिली है जिसके लिए मैं माउस को अनुकरण करना चाहता हूं एक विशिष्ट एक्स, वाई समन्वय पर क्लिक करें। मेरे पास पहले से ही एचडब्ल्यूएन है लेकिन मुझे यकीन नहीं है कि एलपीएआरएम का निर्माण कैसे करें। मैंने अतीत में SendMessage का उपयोग बटन, इत्यादि पर पर क्लिक करने के लिए किया है, लेकिन मुझे उनके hwnds पता था। किसी भी मदद की सराहना की जाएगी। मैं भी मदद नहीं कर सकता लेकिन आश्चर्यचकित हूं कि मैं इस बारे में सही तरीके से जा रहा हूं। मेरा अंतिम लक्ष्य स्काइप मुख्य विंडो (उदाहरण के लिए) पर एक निश्चित उपयोगकर्ता पर क्लिक कर रहा है। मैंने सभी मुख्य विंडो के बच्चों को खोजने के लिए EnumChildWindows का उपयोग किया, लेकिन सही नहीं मिला। तो लगा कि मैं निर्देशांक का उपयोग करके उस पर 'क्लिक' करने का प्रयास करूंगा।पायथन win32 अनुकरण

उत्तर

7

आप निम्न स्तर की विंडोज़ एपीआई का उपयोग कर सकते हैं। एक उदाहरण देखें (कुछ से अनुकूलित मैं इसे परीक्षण नहीं किया था लेकिन यह ठीक होना चाहिए)

import ctypes 
MOUSEEVENTF_MOVE = 0x0001 # mouse move 
MOUSEEVENTF_ABSOLUTE = 0x8000 # absolute move 
MOUSEEVENTF_MOVEABS = MOUSEEVENTF_MOVE + MOUSEEVENTF_ABSOLUTE 

MOUSEEVENTF_LEFTDOWN = 0x0002 # left button down 
MOUSEEVENTF_LEFTUP = 0x0004 # left button up 
MOUSEEVENTF_CLICK = MOUSEEVENTF_LEFTDOWN + MOUSEEVENTF_LEFTUP 

def click(x, y): 
    #move first 
    x = 65536L * x/ctypes.windll.user32.GetSystemMetrics(0) + 1 
    y = 65536L * y/ctypes.windll.user32.GetSystemMetrics(1) + 1 
    ctypes.windll.user32.mouse_event(MOUSEEVENTF_MOVEABS, x, y, 0, 0) 

    #then click 
    ctypes.windll.user32.mouse_event(MOUSEEVENTF_CLICK, 0, 0, 0, 0) 

अद्यतन: मैं नीचे दिए गए कोड का परीक्षण नहीं किया था लेकिन मुझे लगता है कि यह मदद करनी चाहिए तुम्हें कुछ लिखने के लिए बच्चे की स्थिति पाएं फिर आप सही स्थिति पर क्लिक करने का प्रयास कर सकते हैं।

CHILD= None 

def the_callback(child_hwnd, regex): 
    '''Pass to win32gui.EnumWindows() to check all the opened windows''' 
    if re.match(regex, win32gui.GetWindowText(child_hwnd)): 
     CHILD= child_hwnd 

win32gui.EnumChildWindows(hwnd, the_callback, regex) 


if CHILD: 
    (x_tl, y_tl, x_br, y_br) = win32gui.GetWindowRect(CHILD) 
+0

हाय त्वरित उत्तर के लिए धन्यवाद। बीटीडब्ल्यू कहता है कि आपके पास मुख्य खिड़की और उनके बच्चों की खिड़कियों का गुच्छा भी उनके hwnds के साथ है ... क्या आप जानते हैं कि मैं उन सभी बच्चों में कुछ विशिष्ट टेक्स्ट सामग्री कैसे देख सकता हूं? और सही एक की पहचान करें ताकि मैं इस पाठ (लिंक) पर क्लिक कर सकूं? ... – nabizan

+0

@nabizan: मेरा अपडेट देखें। मुझे उम्मीद है कि अगर यह गलत है तो – luc

+0

हमम मुझे सही करने में मदद करता है लेकिन * .GetWindowText केवल विंडो का शीर्षक देता है। यह मेरे लिए कुछ नया है और मुझे नहीं पता कि यह वास्तव में कैसे काम कर रहा है, लेकिन मुझे लगता है कि जब भी आप कुछ जटिल ऐप (जैसे फोटोशॉप) की खिड़की खोलते हैं तो आपको मुख्य एचडब्ल्यूएन और बच्चों की खिड़कियां मिलती हैं (उनके पास शीर्षक नहीं होता है) तो सबसे पहले आपको एक विशिष्ट बाल खिड़की की खोज करना है उदाहरण के लिए कुछ यादृच्छिक जेनरेट किए गए लिंक के साथ और इसके बाद आप इसे क्लिक कर सकते हैं ... मुझे नहीं पता कि यह सही तरीके से अंधा जा रहा है, तो – nabizan

8

मुझे लगता है कि यह आपके लिए अच्छा है, आप इसे सीधे या अपने पायथन कार्यक्रम में आयात कर सकते हैं।

"""mousemacro.py defines the following functions: 

click() -- calls left mouse click 
hold() -- presses and holds left mouse button 
release() -- releases left mouse button 

rightclick() -- calls right mouse click 
righthold() -- calls right mouse hold 
rightrelease() -- calls right mouse release 

middleclick() -- calls middle mouse click 
middlehold() -- calls middle mouse hold 
middlerelease() -- calls middle mouse release 

move(x,y) -- moves mouse to x/y coordinates (in pixels) 
getpos() -- returns mouse x/y coordinates (in pixels) 
slide(x,y) -- slides mouse to x/y coodinates (in pixels) 
       also supports optional speed='slow', speed='fast' 
""" 

from ctypes import* 
from ctypes.wintypes import * 
from time import sleep 
import win32ui 

__all__ = ['click', 'hold', 'release', 'rightclick', 'righthold', 'rightrelease', 'middleclick', 'middlehold', 'middlerelease', 'move', 'slide', 'getpos'] 

# START SENDINPUT TYPE DECLARATIONS 
PUL = POINTER(c_ulong) 

class KeyBdInput(Structure): 
    _fields_ = [("wVk", c_ushort), 
      ("wScan", c_ushort), 
      ("dwFlags", c_ulong), 
      ("time", c_ulong), 
      ("dwExtraInfo", PUL)] 

class HardwareInput(Structure): 
    _fields_ = [("uMsg", c_ulong), 
      ("wParamL", c_short), 
      ("wParamH", c_ushort)] 

class MouseInput(Structure): 
    _fields_ = [("dx", c_long), 
      ("dy", c_long), 
      ("mouseData", c_ulong), 
      ("dwFlags", c_ulong), 
      ("time",c_ulong), 
      ("dwExtraInfo", PUL)] 

class Input_I(Union): 
    _fields_ = [("ki", KeyBdInput), 
       ("mi", MouseInput), 
       ("hi", HardwareInput)] 

class Input(Structure): 
    _fields_ = [("type", c_ulong), 
      ("ii", Input_I)] 

class POINT(Structure): 
    _fields_ = [("x", c_ulong), 
      ("y", c_ulong)] 
# END SENDINPUT TYPE DECLARATIONS 

    # LEFTDOWN = 0x00000002, 
    # LEFTUP  = 0x00000004, 
    # MIDDLEDOWN = 0x00000020, 
    # MIDDLEUP = 0x00000040, 
    # MOVE  = 0x00000001, 
    # ABSOLUTE = 0x00008000, 
    # RIGHTDOWN = 0x00000008, 
    # RIGHTUP = 0x00000010 

MIDDLEDOWN = 0x00000020 
MIDDLEUP = 0x00000040 
MOVE  = 0x00000001 
ABSOLUTE = 0x00008000 
RIGHTDOWN = 0x00000008 
RIGHTUP = 0x00000010 


FInputs = Input * 2 
extra = c_ulong(0) 

click = Input_I() 
click.mi = MouseInput(0, 0, 0, 2, 0, pointer(extra)) 
release = Input_I() 
release.mi = MouseInput(0, 0, 0, 4, 0, pointer(extra)) 

x = FInputs((0, click), (0, release)) 
#user32.SendInput(2, pointer(x), sizeof(x[0])) CLICK & RELEASE 

x2 = FInputs((0, click)) 
#user32.SendInput(2, pointer(x2), sizeof(x2[0])) CLICK & HOLD 

x3 = FInputs((0, release)) 
#user32.SendInput(2, pointer(x3), sizeof(x3[0])) RELEASE HOLD 


def move(x,y): 
    windll.user32.SetCursorPos(x,y) 

def getpos(): 
    global pt 
    pt = POINT() 
    windll.user32.GetCursorPos(byref(pt)) 
    return pt.x, pt.y 

def slide(a,b,speed=0): 
    while True: 
     if speed == 'slow': 
      sleep(0.005) 
      Tspeed = 2 
     if speed == 'fast': 
      sleep(0.001) 
      Tspeed = 5 
     if speed == 0: 
      sleep(0.001) 
      Tspeed = 3 

     x = getpos()[0] 
     y = getpos()[1] 
     if abs(x-a) < 5: 
      if abs(y-b) < 5: 
       break 

     if a < x: 
      x -= Tspeed 
     if a > x: 
      x += Tspeed 
     if b < y: 
      y -= Tspeed 
     if b > y: 
      y += Tspeed 
     move(x,y) 


def click(): 
    windll.user32.SendInput(2,pointer(x),sizeof(x[0])) 

def hold(): 
    windll.user32.SendInput(2, pointer(x2), sizeof(x2[0])) 

def release(): 
    windll.user32.SendInput(2, pointer(x3), sizeof(x3[0])) 


def rightclick(): 
    windll.user32.mouse_event(RIGHTDOWN,0,0,0,0) 
    windll.user32.mouse_event(RIGHTUP,0,0,0,0) 

def righthold(): 
    windll.user32.mouse_event(RIGHTDOWN,0,0,0,0) 

def rightrelease(): 
    windll.user32.mouse_event(RIGHTUP,0,0,0,0) 


def middleclick(): 
    windll.user32.mouse_event(MIDDLEDOWN,0,0,0,0) 
    windll.user32.mouse_event(MIDDLEUP,0,0,0,0) 

def middlehold(): 
    windll.user32.mouse_event(MIDDLEDOWN,0,0,0,0) 

def middlerelease(): 
    windll.user32.mouse_event(MIDDLEUP,0,0,0,0) 

if __name__ == '__main__': 
    while 1: 
     move(10,1) 
+0

धन्यवाद यह ठीक दिखता है – nabizan

+0

यह पूरी तरह से कमाल है! धन्यवाद। – IronManMark20