2011-12-06 20 views
10

कैसे स्थानांतरित करें (या कुछ भी करें) मैं जावा और जेएनए (जावा नेटिव एक्सेस) का उपयोग कर विंडोज एपीआई के साथ कैसे बातचीत कर सकता हूं, लेकिन सड़क-ब्लॉक पर हूं। मैं माउस इनपुट स्ट्रीम पर माउस इवेंट क्यूई करके माउस को कुछ करने की कोशिश कर रहा हूं, और कोड काम करता है, जिसमें SendInput(...) विधि रिटर्न 1 सुझाव देता है कि उसने सफलतापूर्वक घटना को कतारबद्ध कर दिया है, लेकिन फिर भी माउस स्वयं कुछ भी नहीं करता है।माउस

मेरे SSCCE:

संपादित करें: dwFlags क्षेत्र में भरने के लिए संपादित। मैंने स्थिरता के कई संयोजनों को स्वयं या बिट-या सफलता के बिना संयुक्त करने की कोशिश की है। फिर, SendInput विधि देता है 1 के रूप में वह किसी कार्यशील विधि का सुझाव चाहिए, लेकिन माउस हिलना नहीं करता है:

import com.sun.jna.Native; 
import com.sun.jna.platform.win32.WinDef.*; 
import com.sun.jna.platform.win32.WinUser.*; 
import com.sun.jna.win32.StdCallLibrary; 

public class MouseUtils { 
    public interface User32 extends StdCallLibrary { 
     public static final long MOUSEEVENTF_MOVE = 0x0001L; 
     public static final long MOUSEEVENTF_VIRTUALDESK = 0x4000L; 
     public static final long MOUSEEVENTF_ABSOLUTE = 0x8000L; 

     User32 INSTANCE = (User32) Native.loadLibrary("user32", User32.class); 
     DWORD SendInput(DWORD dWord, INPUT[] input, int cbSize); 
    } 

    public static void main(String[] args) { 
     INPUT input = new INPUT(); 
     input.type = new DWORD(INPUT.INPUT_MOUSE); 

     input.input.mi.dx = new LONG(500); 
     input.input.mi.dy = new LONG(500); 
     input.input.mi.mouseData = new DWORD(0); 
     input.input.mi.dwFlags = new DWORD(User32.MOUSEEVENTF_MOVE 
      | User32.MOUSEEVENTF_VIRTUALDESK | User32.MOUSEEVENTF_ABSOLUTE); 
     // input.input.mi.dwFlags = new DWORD(0x8000L); 
     input.input.mi.time = new DWORD(0); 

     INPUT[] inArray = {input}; 

     int cbSize = input.size(); // mouse input struct size 
     DWORD nInputs = new DWORD(1); // number of inputs 
     DWORD result = User32.INSTANCE.SendInput(nInputs , inArray, cbSize); 
     System.out.println("result: " + result); // return 1 if the 1 event successfully inserted 
    } 
} 

संपादित करें 2:

अधिक पढ़ने करना, और ऐसा लगता है कि की मेरी समझ जेएनए के साथ सरणी कम है, मुझे सी सरणी के संदर्भ में सोचना है जहां एक सरणी बस संगत स्मृति के क्षेत्र में एक सूचक है। आने के लिए और (मुझे उम्मीद है!)।

+0

Offtopic: यह हमेशा आप, अच्छा आरामदेह और लोगों के साथ दोस्ताना को देखने का एक खुशी है। आप उन लोगों में से एक हैं जिन्हें मैं वास्तव में यहां देखता हूं। छुट्टियां आनंददायक हों; और एक महान वर्ष 2017! – GhostCat

+1

@GostCat: आपका पहला कथन कुछ हद तक मजाकिया है, लेकिन आपका दूसरा बहुत दयालु है। और मैं आप पर निर्भर करता हूं, आपकी क्षमताओं और दूसरों को अपना ज्ञान फैलाने की आपकी इच्छा। –

उत्तर

9

JNA दस्तावेज़ Using Structures And Unions पढ़ता है:

यूनियन आम तौर पर संरचनाएं साथ परस्पर विनिमय कर रहे हैं, लेकिन आवश्यकता है कि आप संकेत मिलता है कि जो संघ क्षेत्र setType विधि के साथ सक्रिय है इससे पहले कि यह ठीक से एक समारोह कॉल करने के लिए पारित किया जा सकता।

मुझे लगता है कि आप setType भाग चूक गए हैं। साथ ही, MOUSEEVENTF_ABSOLUTE, dx और dy का उपयोग करते समय माउस के समन्वय के रूप में निर्दिष्ट किया गया है, पिक्सल नहीं।

के बाद काम करता है:

public interface User32 extends StdCallLibrary { 
    ... 
    public static final int SM_CXSCREEN = 0x0; 
    public static final int SM_CYSCREEN = 0x1; 
    int GetSystemMetrics(int index); 
} 

public static void main(String[] args) {  
    ... 
    input.input.setType("mi"); 
    input.input.mi.dx = new LONG(500 * 65536/User32.INSTANCE.GetSystemMetrics(User32.SM_CXSCREEN)); 
    input.input.mi.dy = new LONG(500 * 65536/User32.INSTANCE.GetSystemMetrics(User32.SM_CYSCREEN)); 
    ... 
} 
+3

पवित्र चिट! 'सेट टाइप (...)' यह था! मैंने गलती से माना था कि इनपुट चर के प्रकार फ़ील्ड को सेट करना पर्याप्त होगा, लेकिन गलत था। आपके सुधार के साथ मेरा कोड काम करता है। मैं आपको धन्यवाद नहीं दे सकता! –

2
input.input.mi.dwFlags = new DWORD(0); 

आपने माउस इनपुट झंडे में से कोई भी निर्दिष्ट नहीं किया है, इसलिए कोई माउस इनपुट नहीं था।

+0

धन्यवाद! मुझे उसमें देखने दो! –

+0

कृपया मेरे प्रश्न और अद्यतन कोड में संपादित देखें। सभी मदद की बहुत सराहना की जाती है! –

+0

आपके महान सुझावों के लिए फिर से धन्यवाद; वे सबसे सहायक थे! –

3

स्मृति की एक संगत ब्लॉक प्राप्त करने के लिए अपनी संरचना पर toArray() विधि को कॉल करें।

INPUT input = new INPUT(); 
INPUT[] arg = (INPUT[])input.toArray(1); 

वैकल्पिक रूप से, आप बस SendInput के लिए एक वैकल्पिक तरीका मानचित्रण घोषणा कर सकते हैं: (? अनुमतियाँ, शायद एमएस UIPI पर नोटों को देखने)

DWORD SendInput(int nInputs, INPUT pInputs, int cbSize); 

हालांकि, वहाँ कुछ और ही चल रहा हो सकता है, के बाद से अपने उदाहरण काम करना चाहिए (कम से कम एक सरणी तत्व के साथ)।

संपादित करें: union.setType() उत्तर वास्तव में सही है।

+0

आपके मूल्यवान सुझावों के लिए धन्यवाद !! मैं इसकी बहुत सराहना करता हूं। मैंने आपकी पोस्ट को अप-वोट दिया है और केवल यही इच्छा है कि मैं उन सभी लोगों के बीच बक्षीस को विभाजित कर सकूं जिन्होंने मदद की। –

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