2010-09-15 19 views
11

मैं एक खिड़की पर एक माउस क्लिक अनुकरण करने की कोशिश कर रहा हूँ। मैं वर्तमान में सफलता के रूप में इस प्रकार है ऐसा करने के लिए है (मैं अजगर का उपयोग कर रहा है, लेकिन यह सामान्य Win32 पर लागू होना चाहिए):win32: माउस आंदोलन अनुकरण किए बिना एक क्लिक अनुकरण करें?

win32api.SetCursorPos((x,y)) 
win32api.mouse_event(win32con.MOUSEEVENTF_LEFTDOWN,0,0) 
win32api.mouse_event(win32con.MOUSEEVENTF_LEFTUP,0,0) 

यह ठीक काम करता है। हालांकि, अगर क्लिक मैन्युअल रूप से माउस को ले जा रहा है, तो कर्सर की स्थिति फेंक दी जाती है। माउस को घुमाने के बिना किसी दिए गए (x,y) समन्वय पर सीधे क्लिक भेजने का कोई तरीका है? मैं बहुत ज्यादा नहीं भाग्य के साथ निम्नलिखित की तरह कुछ की कोशिश की है:

nx = x*65535/win32api.GetSystemMetrics(0) 
ny = y*65535/win32api.GetSystemMetrics(1) 
win32api.mouse_event(win32con.MOUSEEVENTF_LEFTDOWN | \ 
        win32con.MOUSEEVENTF_ABSOLUTE,nx,ny) 
win32api.mouse_event(win32con.MOUSEEVENTF_LEFTUP | \ 
        win32con.MOUSEEVENTF_ABSOLUTE,nx,ny) 

उत्तर

7

प्रयास करें WindowFromPoint() फ़ंक्शन:

POINT pt; 
    pt.x = 30; // This is your click coordinates 
    pt.y = 30; 

HWND hWnd = WindowFromPoint(pt); 
LPARAM lParam = MAKELPARAM(pt.x, pt.y); 
PostMessage(hWnd, WM_RBUTTONDOWN, MK_RBUTTON, lParam); 
PostMessage(hWnd, WM_RBUTTONUP, MK_RBUTTON, lParam); 
+1

मेरे पास निर्देशांक पूर्ण निर्देशांक हैं, हालांकि, खिड़की की स्थिति के सापेक्ष समन्वय नहीं करते हैं .. क्या पोस्टमेसेज उन्हें पूर्ण रूप से या खिड़की से संबंधित लोगों के रूप में प्रेषित करेगा? मैं वास्तव में पहले से ही hwnd प्राप्त कर सकता था, लेकिन सिर्फ मेरे coords का अनुवाद '(एक्स - बाएं, वाई - शीर्ष) ', जहां मुझे' GetWindowRect' से' बाएं 'और' शीर्ष 'मिला है, सही स्थान पर क्लिक नहीं किया गया था। – Claudiu

+0

आह, वास्तव में। आपको एक पूर्ण क्लिक स्थिति को रिश्तेदार में बदलने की जरूरत है। PostMessage – Andrew

+0

ah ty से पहले ScreenToClient (hWnd, lpPoint) का उपयोग करें, मैं कोशिश करूँगा! क्या इस मामले में पोस्टमेसेज और प्रेषण के बीच कोई अंतर है? – Claudiu

3

इस सवाल का जवाब नहीं है, लेकिन यह मेरी समस्या का समाधान करता है:

win32api.ClipCursor((x-1,y-1,x+1,y+1)) 
win32api.SetCursorPos((x,y)) 
win32api.mouse_event(win32con.MOUSEEVENTF_LEFTDOWN| \ 
        win32con.MOUSEEVENTF_ABSOLUTE,0,0) 
win32api.mouse_event(win32con.MOUSEEVENTF_LEFTUP| \ 
        win32con.MOUSEEVENTF_ABSOLUTE,0,0) 
win32api.ClipCursor((0,0,0,0)) 

परिणाम यह है कि मैं जो भी आंदोलन कर रहा हूं वह क्लिक में हस्तक्षेप नहीं करेगा। नकारात्मकता यह है कि मेरा वास्तविक आंदोलन गड़बड़ हो जाएगा, इसलिए मैं अभी भी सुझावों के लिए खुला हूं।

संबंधित मुद्दे