2013-07-19 8 views
5

पर क्लिक करने के लिए मेरे पास एक प्रोजेक्ट है जिसमें एकाधिक विंडो क्लाइंट खोलने और फिर उन प्रक्रियाओं में से प्रत्येक के भीतर माउस क्लिक को अनुकरण करना शामिल है। मैं Win32 API और SendMessage का उपयोग करके नोटपैड के कई उदाहरणों पर सफलतापूर्वक संदेश भेज सकता हूं।वेब ऑटोमेशन माउस

Process[] notepads = Process.GetProcessesByName("notepad"); 
      foreach (Process proc in notepads) 
      { 
        IntPtr handle = proc.Handle; 
        IntPtr child = FindWindowEx(proc.MainWindowHandle, new IntPtr(0), "Edit", null); 
        if (child != null) 
        { 
         MessageBox.Show("Child was found, sending text"); 
         SendMessage(child, 0x000C, 0, "test"); 
        } 
       } 
      } 

यह कोई फर्क नहीं पड़ता कि हर उदाहरण मैं नोटपैड की खोल दिए हैं, करने के लिए "परीक्षण" भेजता कितने: कोड है कि मेरे लिए काम करता इस प्रकार है। जैसा कि आप देख सकते हैं कि मैं एक प्रक्रिया के हर उदाहरण के माध्यम से पुनरावृत्ति कर रहा हूं, और बस संदेश को लूप कर रहा हूं। बिल्कुल मुश्किल नहीं था ...

अंतिम लक्ष्य नोटपैड नहीं है, बल्कि माइक्रोसॉफ्ट एक्सटेंशन Awesomium है। मैंने खिड़की के हैंडल को पुनर्प्राप्त किया, और उसके बाद बच्चे (Awesomium) कक्षा का नाम, जो Chrome_RenderWidgetHostHWND है। वहां से, मैंने सिस्टम द्वारा पठनीय इकट्ठा करने और lParam को पढ़ने योग्य बनाने के लिए Sendmessage में चर प्रकारों को पुन: सक्रिय करके माउस ईवेंट भेजने की कोशिश की।

[DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = false)] 
     static extern IntPtr SendMessage(IntPtr hWnd, uint Msg, IntPtr wParam, IntPtr lParam); 

कुछ उदाहरण मैंने पाया मैं lParam इकट्ठा इस के माध्यम से उपयोग करना::

int x = 834; 
int y = 493; 
IntPtr lParam = (IntPtr)((y << 16) | x); 
IntPtr wParam = IntPtr.Zero; 

मैं वैश्विक माउस हुक का उपयोग कर रहा सभी चाइल्ड विंडो में प्रेस की घटनाओं का पता लगाने के, और जब मैं यहाँ कि कोड है प्रक्रिया के माध्यम से पुन: प्रयास करने के लिए मेरे बटन दबाएं और क्लिक करें, कुछ भी नहीं भेजा गया है। मुझे पता है कि मैं यहाँ कुछ बेवकूफ कर रहा हूं जिससे माउस क्लिक नहीं भेजे जा रहे हैं। किसी भी मामले में, मेरे पास अंतिम कोड संरचना है जो मेरे पास है। कोई सलाह, या सुझावों की सराहना की जाएगी। धन्यवाद।

private void button2_Click(object sender, EventArgs e) 
    { 
     Process[] notepads = Process.GetProcessesByName("client"); 
     foreach (Process proc in notepads) 
     { 
       IntPtr handle = proc.Handle; 
       string mine = Convert.ToString(proc); 
       MessageBox.Show(mine); 
       IntPtr child = FindWindowEx(proc.MainWindowHandle, new IntPtr(0), "Chrome_RenderWidgetHostHWND", null); 
       if (child != null) 
       { 
       int x = 834; 
       int y = 493; 
       IntPtr lParam = (IntPtr)((y << 16) | x); 
       IntPtr wParam = IntPtr.Zero; 
       SendMessage(child, 0x201, wParam, lParam); 
       SendMessage(child, 0x202, wParam, lParam); 
       } 
      } 
     } 
+0

मेरे कोड के साथ कई त्रुटियों को समझते हुए, अंत में मैंने WinInspector में गहरा खोला और माउस क्लिक शुरू करने के लिए आवश्यक सभी आदेशों को पुनर्प्राप्त किया। मैं ऐसा नोब हूँ। भविष्य में किसी के लिए, यहां Win32 का उपयोग करके Awesomium पर क्लिक को सक्रिय करने के लिए आवश्यक संदेश हैं, सबसे अधिक संभावना यह सभी के लिए समान है। WM_PARENTNOTIFY, WM_MOUSEACVTIVATE, WM_LBUTTONDOWN। इन तीन आदेशों की श्रृंखला माता-पिता को सूचित करेगी कि उपयोगकर्ता ने माउस को सक्रिय किया है, फिर यह एक संक्षिप्त हिट करता है, फिर अंत में बाएं बटन को दबा देता है। उम्मीद है कि यह किसी की मदद करता है। – user2578424

+3

आपको एक उत्तर देना चाहिए और फिर इसे स्वीकार करना चाहिए। – Xcelled194

उत्तर

1

या आप SendInput बजाय इस्तेमाल कर सकते हैं, जो सही ढंग से माउस हुक की उपस्थिति में काम करेगी; आपका समाधान (सीधे संदेश पोस्ट करने का) नहीं होगा।

अधिक महत्वपूर्ण बात यह है कि अगर प्रक्रिया सक्रियण को अस्वीकार कर देती है (यानी, यदि लक्ष्य WM_MOUSEACTIVATE से 0 लौटाता है), तो WM_LBUTTONDOWN नहीं भेजा जाएगा।

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