F #

2010-11-14 14 views
5

में माउस क्लिक और कीप्रेस को अनुकरण कैसे करें मैं एक ऐसा प्रोग्राम कर रहा हूं जो माउस को चारों ओर ले जाने और कोड में निर्दिष्ट स्थानों पर स्वचालित रूप से दबाए जाने के लिए है। अभी मैं इस लाइन का उपयोग करके कर्सर ले जाने में कामयाब रहे है: Cursor.Position < - System.Drawing.Point (एक्स, वाई)F #

क्या मैं अभी तक बाहर नहीं मिला है है mouseclicks या keypresses अनुकरण करने के लिए कैसे । एमएसडीएन (http://msdn.microsoft.com/en-us/library/system.windows.forms.sendkeys.aspx) से SendKeys क्लास के बारे में मुझे मिली एकमात्र चीज़ है। मैंने इस वर्ग के साथ एक कीप्रेस को अनुकरण करने की कोशिश की, लेकिन मुझे रन-टाइम त्रुटि संदेश मिलता है।

लाइन मैं का उपयोग करें: SendKeys.Send ("{ENTER}")

मैं त्रुटि संदेश:। क्योंकि आवेदन विंडोज संदेशों को संभालने नहीं है "SendKeys इस एप्लिकेशन पर दिखाए जाने नहीं कर सकते या तो परिवर्तन संदेशों को संभालने के लिए आवेदन, या SendKeys.SendWait विधि का उपयोग करें। "

इसलिए मैंने इसे SendWait विधि से बदल दिया, लेकिन यह अभी भी कीप्रेस भेजने के लिए प्रतीत नहीं होता है। मैं यह कैसे करु? मैं वास्तव में तैयार प्रोग्राम को करने में सक्षम होना चाहता हूं, जो कि पृष्ठभूमि में पहले से ही खुले दूसरे प्रोग्राम पर कुंजी और माउस क्लिक भेज रहा है। उदाहरण के लिए, पेंट में स्वचालित रूप से एक चित्र पेंटिंग।

उत्तर

3

यदि आप Win32 देशी इंटरऑप से बचना चाहते हैं, Windows Input SimulatorSendInput के आसपास एक आशाजनक दिखने वाला प्रबंधित रैपर है। लेकिन नवीनतम रिलीज माउस सिमुलेशन का समर्थन नहीं करता है। हालांकि, सक्रिय ट्रंक में माउस सिमुलेशन का समर्थन करने के लिए एक पैच है (this चर्चा देखें)। प्रोजेक्ट वीएस -2010 सी # का उपयोग कर रहा है, और आप उपversण भंडार here से खुद को निर्यात और निर्माण कर सकते हैं।

यदि आप Win32 देशी इंटरऑप में रुचि रखते हैं, तो मैंने एक साथ प्रदर्शन किया है कि SendInput API का उपयोग F # के साथ कैसे किया जाए। यह एप्लिकेशन एक राइट क्लिक अनुकरण करता है।

open System 
open System.Runtime.InteropServices 

type MOUSEINPUT = struct 
    val dx:int 
    val dy:int 
    val mouseData:int 
    val dwFlags:int 
    val time:int 
    val dwExtraInfo:int 
    new(_dx, _dy, _mouseData, _dwFlags, _time, _dwExtraInfo) = {dx=_dx; dy=_dy; mouseData=_mouseData; dwFlags=_dwFlags; time=_time; dwExtraInfo=_dwExtraInfo} 
end 

type INPUT = struct 
    //need to escape traditional INPUT identifier here since "type" is a reserved word 
    //though could use any other identifier name if so desired 
    val ``type``:int //0 is mouse 
    val mi:MOUSEINPUT 
    new(_type, _mi) = {``type``=_type; mi=_mi} 
end 

let MOUSEEVENTF_RIGHTDOWN = 0x0008 
let MOUSEEVENTF_RIGHTUP = 0x0010 

[<DllImport("user32.dll", SetLastError=true)>] 
extern uint32 SendInput(uint32 nInputs, INPUT* pInputs, int cbSize) 

let mutable inputRightDown = INPUT(0, MOUSEINPUT(0, 0, 0, MOUSEEVENTF_RIGHTDOWN, 0, 0)) 
let mutable inputRightUp = INPUT(0, MOUSEINPUT(0, 0, 0, MOUSEEVENTF_RIGHTUP, 0, 0)) 

SendInput(uint32 1, &&inputRightDown, Marshal.SizeOf(inputRightDown)) 
SendInput(uint32 1, &&inputRightUp, Marshal.SizeOf(inputRightUp)) 

अपने प्रश्न के दूसरे पढ़ने पर, मुझे लगता है कि अंत में आप जिस स्थिति में SendMessage/PostMessage अधिक उपयुक्त एपीआई हो सकता है पृष्ठभूमि में चल रहा एक आवेदन, के लिए नकली माउस और कीबोर्ड की घटनाओं को भेजना चाहते हैं देखते हैं। इसके लिए अभी भी मूल इंटरऑप की आवश्यकता होगी, और उम्मीद है कि SendInput का उपयोग करके मेरा उदाहरण मदद करेगा। Here एक संबंधित प्रश्न है।

+0

InputSimulator के लिए बहुत बढ़िया टिप !! +1 –

0
open System.Runtime.InteropServices 

module InteropWithNative = 
    [<DllImport("user32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)>] 
    extern void mouse_event(System.Int64, System.Int64, System.Int64, System.Int64, System.Int64) 

    let MOUSEEVENTF_LEFTDOWN = 0x02L 
    let MOUSEEVENTF_LEFTUP  = 0x04L 
    let MOUSEEVENTF_RIGHTDOWN = 0x08L 
    let MOUSEEVENTF_RIGHTUP  = 0x10L 

    let MouseLeftClick() = 
     mouse_event(MOUSEEVENTF_LEFTDOWN, 0L, 0L, 0L, 0L) 
     mouse_event(MOUSEEVENTF_LEFTUP, 0L, 0L, 0L, 0L) 

तब उपयोग करने के लिए:

InteropWithNative.MouseLeftClick() 
संबंधित मुद्दे

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