2011-04-26 21 views
8

मैं SendInput का उपयोग कर x, y समन्वय पर विंडो पर एक डबल माउस क्लिक (मैं इस विंडो के हैंडल को कैसे जानता हूं) पर अनुकरण कैसे कर सकता हूं?मैं SendInput का उपयोग कर x, y समन्वय पर विंडो (i khow handle) पर एक डबल माउस क्लिक को अनुकरण कैसे कर सकता हूं?

उत्तर

14
void DoubleClick(int x, int y) 
{ 
    const double XSCALEFACTOR = 65535/(GetSystemMetrics(SM_CXSCREEN) - 1); 
    const double YSCALEFACTOR = 65535/(GetSystemMetrics(SM_CYSCREEN) - 1); 

    POINT cursorPos; 
    GetCursorPos(&cursorPos); 

    double cx = cursorPos.x * XSCALEFACTOR; 
    double cy = cursorPos.y * YSCALEFACTOR; 

    double nx = x * XSCALEFACTOR; 
    double ny = y * YSCALEFACTOR; 

    INPUT Input={0}; 
    Input.type = INPUT_MOUSE; 

    Input.mi.dx = (LONG)nx; 
    Input.mi.dy = (LONG)ny; 

    Input.mi.dwFlags = MOUSEEVENTF_MOVE | MOUSEEVENTF_ABSOLUTE | MOUSEEVENTF_LEFTDOWN | MOUSEEVENTF_LEFTUP; 

    SendInput(1,&Input,sizeof(INPUT)); 
    SendInput(1,&Input,sizeof(INPUT)); 

    Input.mi.dx = (LONG)cx; 
    Input.mi.dy = (LONG)cy; 

    Input.mi.dwFlags = MOUSEEVENTF_MOVE | MOUSEEVENTF_ABSOLUTE; 

    SendInput(1,&Input,sizeof(INPUT)); 
} 

आप GetWindowRect उपयोग कर सकते हैं() इसके हैंडल से विंडो की स्थिति हो और रिश्तेदार x और y डबलक्लिक कार्य करने के लिए पारित करने के लिए: (सर्वोत्तम) या विधि

RECT rect; 
GetWindowRect(hwnd, &rect); 

HWND phwnd = GetForegroundWindow(); 

SetForegroundWindow(hwnd); 

DoubleClick(rect.left + x, rect.top + y); 

SetForegroundWindow(phwnd); // To activate previous window 
1

this website में कोड का एक टुकड़ा है। उत्तराधिकार में दो बार फ़ंक्शन LeftClick() का उपयोग करने का प्रयास करें। यह चाल this guy के अनुसार है।

2

आप अपने लक्ष्य को निर्दिष्ट कर सकते हैं, लेकिन यदि आप दोनों को निर्दिष्ट करने का प्रयास करते हैं, तो अक्सर उत्तर नहीं दिया जा रहा है "यह उस तरह काम नहीं करता है"।

SendInput इस तरह काम नहीं करता है, यह स्क्रीन पर माउस गतिविधि को अनुकरण करता है, जो उस स्थान पर जो भी विंडो दिखाई दे रहा है (या माउस कैप्चर होता है), आपकी पसंद की खिड़की नहीं।

किसी विशिष्ट विंडो पर डबल-क्लिक करने के लिए, PostMessage(hwnd, WM_LBUTTONDBLCLK, 0, MAKEDWORD(x, y)) आज़माएं।

4

यह निश्चित निर्देशांक

SetCursorPos(X,Y); 
    mouse_event(MOUSEEVENTF_LEFTDOWN | MOUSEEVENTF_LEFTUP,0,0,0,0); 
    mouse_event(MOUSEEVENTF_LEFTDOWN | MOUSEEVENTF_LEFTUP,0,0,0,0); 
0

मेरे 'प्रतिष्ठा' के बाद से एक डबल क्लिक करें अनुकरण करेगा पर्याप्त नहीं है (अभी तक), मैं # fardjad के समाधान पर टिप्पणी करना चाहते हैं: यह बहुत अच्छा काम करता है, लेकिन एक "मुख्य" दिनचर्या में निम्नलिखित जोड़ सकते हैं:

SetForegroundWindow(hwnd); 
SetCursorPos(rect.left + x, rect.top + y); 
// which shows your current mouseposition... 
// during my testing, I used a _getch() so that I actually could verify it 
Sleep(nWinSleep); 
// delay the mouseclick, as window might not get to foreground quick enough; 
    took me awhile to figure this one out... 
DoubleClick(rect.left + x, rect.top + y);