2010-05-12 11 views
6

मैं किसी प्रोग्राम पर माउस क्लिक भेजने की कोशिश कर रहा हूं। चूंकि मैं नहीं चाहता कि माउस आगे बढ़े, मैं SendInput या mouse_event का उपयोग नहीं करना चाहता, और क्योंकि विंडो जो क्लिक प्राप्त कर लेती है वह वास्तव में बटन या अन्य जीयूआई घटनाओं का उपयोग नहीं करती है, मैं इन्हें संदेश नहीं भेज सकता बटन।संदेश भेजकर माउस पर क्लिक करना

मैं SendMessage का उपयोग करके यह काम करने की कोशिश कर रहा हूं, लेकिन किसी कारण से यह काम नहीं करता है। प्रासंगिक कोड (सी # में है, लेकिन साथ ही jnative साथ जावा की कोशिश की) है, विस्टा

[DllImport("user32.dll", CharSet=CharSet.Auto)] 
    public static extern int SendMessage(IntPtr A_0, int A_1, int A_2, int A_3); 

    static int WM_CLOSE = 0x10; 
    static int WM_LBUTTONDOWN = 0x201; 
    static int WM_LBUTTONUP = 0x202; 

    public static void click(IntPtr hWnd, int x, int y) 
    { 
     SendMessage(hWnd, WM_LBUTTONDOWN, 1, ((x << 0x10)^y)); 
     SendMessage(hWnd, WM_LBUTTONUP, 0, ((x << 0x10)^y)); 
    } 

    public static void close(IntPtr hWnd) 
    { 
     SendMessage(hWnd, WM_CLOSE, 0, 0); 
    } 

close ठीक काम करता है पर इस कोशिश कर रहा है, लेकिन click कुछ भी नहीं है।

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

 POINT p = new POINT(x, y); 
     IntPtr hWnd = WindowFromPoint(p); 

     RECT rct = new RECT(); 

     if (!GetWindowRect(hWnd, ref rct)) 
     { 
      return; 
     } 

     int newx = x - rct.Left; 
     int newy = y - rct.Top; 
     SendMessage(hWnd, WM_LBUTTONDOWN, 1, newy * 65536 + newx); 
     SendMessage(hWnd, WM_LBUTTONUP, 0, newy * 65536 + newx); 

जो सही काम करता है।

उत्तर

4

समस्या x, y निर्देशांक के आपके पैकिंग के साथ समस्या है।

  1. y उच्च आदेश शब्द में होना चाहिए
  2. आप का उपयोग करना चाहिए | (बिटवाइज़ या) समन्वय जोड़ी के घटक गठबंधन करने के लिए

आप होना चाहिए निम्नलिखित

((y << 0x10) | x) 
+0

@tobbez, समस्या यह है कि MAKELPARAM एक सी मैक्रो है, ओपीएस कोड वास्तव में सी # है और वह Win32 एपीआई में कॉल करने के लिए इंटरऑप का उपयोग कर रहा है। –

+1

और भी बेहतर '(वाई << 16) | (एक्स और 0 एक्सएफएफ) ' – BlackBear

0

आप सही ढंग से निर्देशांक पैक क्रिस कहते हैं की तरह, यह भी याद रखें कि x और y ग्राहक निर्देशांक हैं की जरूरत है , स्क्रीन निर्देशांक कनवर्ट करने के लिए ScreenToClient() पर कॉल करें।

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