दिलचस्प पोस्ट
रूबी में विधि तर्कों का उपयोग करने का कोई तरीका है? रूबी के सेटर्स को कक्षा में "आत्म" योग्यता की आवश्यकता क्यों है? () फ़ंक्शन की तलाश? मैं सीएमटी में प्रमाणित कैसे कर सकता हूँ सी # संरचना में संरचना को प्रतिलिपि बनाएँ फास्ट हार्वेसेन एक्सपोसिमेशन (पायथन / पांडा) एफ # में इरोटोथेनिनेस की छलनी पीएचपी – एक लॉगिन सिस्टम के साथ सुरक्षित सदस्य-केवल पृष्ठ सॉफ्ट कीबोर्ड के आयामों को प्राप्त करना कोणीय: * एनजी क्लास के साथ सशर्त वर्ग कैसे मेरे पुस्तकालय से निष्पादन योग्य में फोन कॉल करने के लिए? Arrays covariant क्यों हैं लेकिन जेनेरिक अपरिवर्तनीय हैं? एंड्रॉइड – TextView पर सीमावर्ती पाठ दिखाने का तरीका? Node.js में प्रबंध सत्र? कैसे एपीआई डिजाइन में "बहुत अधिक पैरामीटर" समस्या से बचने के लिए?

जावा विंडो में मेरी विंडो के बाहर माउस क्लिक निर्देशांक कैसे प्राप्त करें

मुझे स्विंग का प्रयोग करके एक वर्ग को कार्यान्वित करने की आवश्यकता है, जो स्क्रीन पर उपयोगकर्ता कहीं भी क्लिक करते समय माउस निर्देशांक प्राप्त कर सकते हैं। अगर मैं अपनी स्वयं की खिड़की के अंदर माउस निर्देशांक प्राप्त करना चाहता था, तो मैं एक MouseListener उपयोग कर रहा था, लेकिन मैं चाहता हूं कि यह काम तब भी करे जब उपयोगकर्ता मेरे कार्यक्रम के बाहर क्लिक करे।

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

वेब के समाधान से एकत्रित समाधान "जावा विंडो में मेरी विंडो के बाहर माउस क्लिक निर्देशांक कैसे प्राप्त करें"

हालांकि यह संभव है:

फ़ोकस ईवेंट के लिए एक AWTEventListener जोड़ें जब तक बटन क्लिक किए जाने से पहले आपका ऐप ध्यान केंद्रित कर रहा है, तब तक आपको फोकस खो दिया गया ईवेंट प्राप्त होगा। फिर सूचक स्थिति के लिए क्वेरी

सीमा यह है कि, ज़ाहिर है, आपका ऐप फोकस खो देता है इसलिए जो आप अंततः इसे हासिल करने की कोशिश कर रहे हैं, उसके आधार पर यह उपयोगी नहीं होगा।

यदि आप फ़ोकस नहीं खोना चाहते हैं, तो आपको अस्थायी रूप से पूरी स्क्रीन का एक स्क्रीनशॉट लेना होगा और प्रदर्शित होगा कि एक स्क्रीन भरने वाली विंडो में जो सामान्य रूप से माउस क्लिक के लिए सुनता है

पहली विधि का सबूत:

 import java.awt.AWTEvent; import java.awt.MouseInfo; import java.awt.Toolkit; import java.awt.event.AWTEventListener; import javax.swing.JFrame; public class Application1 { public static void main(String[] args) { Toolkit.getDefaultToolkit().addAWTEventListener( new Listener(), AWTEvent.MOUSE_EVENT_MASK | AWTEvent.FOCUS_EVENT_MASK); JFrame frame = new JFrame(); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setVisible(true); } private static class Listener implements AWTEventListener { public void eventDispatched(AWTEvent event) { System.out.print(MouseInfo.getPointerInfo().getLocation() + " | "); System.out.println(event); } } } 

उत्पादित ऐप के बाहर क्लिक करना:

 java.awt.Point[x=198,y=59] | java.awt.event.MouseEvent[MOUSE_EXITED, ... java.awt.Point[x=976,y=503] | java.awt.FocusEvent[FOCUS_LOST, ... 

दूसरा बिंदु ऐप के बाहर है।

GlassPane बारे में भूल GlassPane , ऐसा करने के लिए एक और 100% मूल जावा तरीका है जो ओएस एक्स और विंडोज पर दोनों काम करता है।

जावा ने हमेशा ओएस एक्स और जावा पर अपनी खिड़कियों के लिए पारस्परिकता का समर्थन किया है, अब विंडोज़ पर अपनी खिड़कियों के लिए पारदर्शीता का समर्थन करता है (जावा 1.6.0_10 या इसके बाद भी, इसकी जांच की जानी चाहिए)।

तो चाल है: "रंग चुनें" टूल पर क्लिक करने पर, आप पूरी स्क्रीन को कवर करने वाली एक लगभग पारदर्शी बॉर्डरहीन जावा विंडो बनाते हैं। आपने इसकी अल्फा 10 से निर्धारित की है (अल्फा 0 से 255 तक जाती है) यह अल्फा इतना कम है कि उपयोगकर्ता यह नहीं देख पाएंगे कि पूरी स्क्रीन को कवर करने में बहुत पतली "लगभग पारदर्शी लेकिन केवल बहुत ही बहुत पारदर्शी" सीमा रेखा है।

अब जब उपयोगकर्ता आपके "अल्फा से 10 पारदर्शी बॉर्डरलेस विंडो पर सेट करता है" पूरी स्क्रीन को कवर करता है, तो आप अपना (एक्स, वाई) प्राप्त करते हैं।

सीमावर्ती जावा विंडो को त्यागें

Robot के getRgb(x,y) और आप काम कर रहे हैं

अल्फा को 10 और न 0 पर क्यों सेट करें? चूंकि अन्यथा क्लिकों को जावा द्वारा रोकना नहीं है, लेकिन सीधे ओएस पर जाएं (कम से कम यह कि यह ओएस एक्स पर एक तथ्य के लिए कैसे काम करता है)। एक सीमा है और मुझे पता है कि यह '1' पर सेट नहीं है, न ही '2', यह लगभग 10 या तो है

संपादित करें मुझे एहसास हुआ कि आपको कई रंग लेने की आवश्यकता है, यह बहुत ही जटिल है, लेकिन अभी भी 100% जावा का उपयोग करके किया जा सकता है। या तो आप "थोड़ा बंद" रंग ("लगभग पारदर्शी" 'अदृश्य' परत से प्रभावित) के साथ रह सकते हैं या क्लिक करने पर आपको परत को हटाना होगा, सही पिक्सल रंग प्राप्त करना होगा और फिर "लगभग पारदर्शी" परत डाल देना चाहिए। अब निश्चित रूप से हैक की एक बिल्ली है लेकिन यह 100% जावा में किया जा सकता है।

उपयोग

 import java.awt.MouseInfo; import java.awt.Point; import java.awt.PointerInfo; PointerInfo inf = MouseInfo.getPointerInfo(); Point p = inf.getLocation(); 

पीएक्स और पीई आपको अपनी विंडो के बाहर समन्वय देगा।

मुझे नहीं पता कि क्या शुद्ध जावा का उपयोग करना संभव है

शुद्ध जावा का उपयोग करना संभव नहीं है, क्योंकि जावा केवल विंडोज़ पर माउसईवेंट्स के बारे में जागरूक है।

इन घटनाओं को विंडो में निर्देशित किया जाता है जिसमें फ़ोकस होता है, डेस्कटॉप पर सभी ईवेंट से आप केवल माउस की स्थिति प्राप्त कर सकते हैं।

जैसा कि पहले से ही केविल द्वारा दिखाया गया है, यह केवल माउस पोस्टियन प्राप्त करना संभव है।

आपको एक स्थानीय लिब में शामिल करना होगा

मैंने खुद को यह नहीं करने की कोशिश की है, लेकिन हो सकता है कि आप एक पूर्ण स्क्रीन, पारदर्शी पैनल / फ्रेम / आदि बना सकें, और उसमें माउस लेस्टनर जोड़ दें।

स्थान (एक्स, वाई) और प्रत्येक क्लिक के बीच का समय अंतराल (डी) कमांड लाइन तर्कों के माध्यम से प्रदान किया जाता है। यहां कार्यक्रम है

 import java.awt.* ; import java.util.* ; public final class ClickMouse extends TimerTask { public static int x, y, d ; public static void main(String[] args) { TimerTask clikMouse = new ClickMouse(); Timer t = new Timer(); /* x = Integer.parseInt(args[0]) ; y = Integer.parseInt(args[1]) ; d = Integer.parseInt(ares[2]) ; */ x = 500; y = 200; d = 5; t.schedule(clikMouse,1000,d*1000); } public void run() { try { Robot bot = new Robot(); bot.mouseMove(x,y); bot.mousePress(java.awt.event.InputEvent.BUTTON1_MASK ); bot.mouseRelease(java.awt.event.InputEvent.BUTTON1_MASK); } catch (Exception e) { System.out.println("Exception occured :" + e.getMessage()); } } } 

मेरे पास टिप्पणियां छोड़ने के लिए पर्याप्त प्रतिनिधि नहीं है, लेकिन यहां अन्य तकनीकों पर मेरी टिप्पणियां हैं:

  • एक देशी लिब का उपयोग करें: काम करेगा, लेकिन स्पष्ट वितरण सीमाएं हैं

  • संपूर्ण स्क्रीन को भरने के लिए ग्लासपेन का उपयोग करें: GlassPanes को एक विंडो में शामिल किया जाना चाहिए।

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

वैकल्पिक समाधान: यदि आप जावा 6u10 या बाद के संस्करण का प्रयोग कर रहे हैं, तो स्क्रीन भरने वाली विंडो का परिष्करण, विंडो को पूरी तरह से पारदर्शी बनाना है। इस विंडो को अन्य सभी के सामने रखो और माउस क्लिक सुनें। इसमें अभी भी कोई कर्सर परिवर्तन नहीं है, लेकिन यह इस बात पर निर्भर करता है कि आप क्या करना चाहते हैं।

सिंटेक्स T3rr0r के उत्तर के आधार पर मैंने ग्रोवी में एक नमूना रंग पिकर बनाया जो दिखाता है कि यह कैसे काम कर सकता है।

 import java.awt.* import java.awt.datatransfer.* //import com.sun.awt.AWTUtilities; import javax.swing.WindowConstants as WC; import javax.swing.SwingConstants as SWC import groovy.swing.SwingBuilder class ColorPicker { SwingBuilder swb = new SwingBuilder() def window; def overlayWindow def mainPanel; def mainLabel; def menu; def transparent = new Color(0, 0, 0, 0); def nearlyTransparent = new Color(0, 0, 0, 26); Color color = new Color(150, 150, 255); def colorHex = { col -> col = col?: color; "#"+Integer.toHexString(col.getRGB())[2..-1] } def getTextColor = { baseColor -> baseColor = baseColor?: color; (baseColor.red*1.5 + baseColor.green*1.5 + baseColor.blue > 400) ? Color.BLACK : Color.WHITE; } def setDisplayColor = {newColor -> mainPanel.background = newColor mainLabel.foreground = getTextColor(newColor) mainLabel.text = colorHex(newColor) } def show(){ menu = swb.popupMenu { // invoker: mainPanel menuItem(text: "Pick Color", actionPerformed: capturePixelColor) menuItem(text: "Copy to Clipboard", actionPerformed: { Clipboard clipboard = Toolkit.getDefaultToolkit().getSystemClipboard(); clipboard.setContents(new StringSelection(colorHex()), null); }) separator() menuItem(text: "Close", actionPerformed: {dispose()}) } window = swb.frame( title: "Color Picker", location:[50,50], size:[60, 60], resizable: false, undecorated: true, alwaysOnTop: true, defaultCloseOperation:WC.EXIT_ON_CLOSE ){ def textColor = getTextColor() mainPanel = panel( constraints: BorderLayout.CENTER, border: lineBorder(color: Color.BLACK), componentPopupMenu: menu){ borderLayout() mainLabel = label(text: "--", constraints: BorderLayout.CENTER, horizontalAlignment: SWC.CENTER) } } setDisplayColor(color); window.show(); } def capturePixelColor = { def screenSize = Toolkit.getDefaultToolkit().screenSize overlayWindow = swb.frame( location:[0,0], size: screenSize, resizable: false, undecorated: true, alwaysOnTop: true, defaultCloseOperation:WC.DISPOSE_ON_CLOSE, show: true, background: nearlyTransparent, // AWTUtilities.setWindowOpacity(overlayWindow, 0.1f); cursor: Cursor.CROSSHAIR_CURSOR, mouseClicked: {event -> int x = event.getXOnScreen() // or maybe getX() is enough int y = event.getYOnScreen() overlayWindow.dispose() overlayWindow = null color = new Robot().getPixelColor(x, y) setDisplayColor(color) } ) } public static void main(String...args){ println "Welcome to ColorPicker" def picker = new ColorPicker() picker.show() } } 

यह थोड़ा चाल के साथ संभव है 100% क्रॉस-प्लेटफ़ॉर्म (लिनक्स और विंडोज पर परीक्षण) होना चाहिए। असल में, आप एक छोटे जेडवांडो बनाते हैं, इसे "हमेशा से ऑन करें" बनाएं और टाइमर के द्वारा माउस के साथ इसे स्थानांतरित करें।

विवरण के लिए, यहां मेरा उत्तर देखें।

देखो, मैं समझता हूँ कि मैं 7 साल का हूँ …

यह कैली के जवाब का एक पुन: बना है, जो कि जब भी माउस बटन पर क्लिक किया जाता है, कहीं भी प्राप्त करने की अनुमति देता है। मुख्य समस्या यह है कि फ़ुलस्क्रीन गेम हमेशा अपकेंद्रित होते हैं, और यह संभाल करने के लिए परेशान हो जाता है।

यहां कोड है:

 import java.awt.AWTEvent; import java.awt.MouseInfo; import java.awt.Point; import java.awt.Toolkit; import java.awt.event.AWTEventListener; import javax.swing.JFrame; public class Main { public static JFrame frame = new JFrame(); public static void main(String[] args) { Toolkit.getDefaultToolkit().addAWTEventListener( new Listener(), AWTEvent.MOUSE_EVENT_MASK | AWTEvent.FOCUS_EVENT_MASK); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setVisible(true); frame.setAlwaysOnTop(true); frame.setLocation(1, 1); } private static class Listener implements AWTEventListener { public void eventDispatched(AWTEvent event) { // We do not want the event to show twice, // as it shows for focusing and unfocusing if(event.getID() == 1004) { Point p = MouseInfo.getPointerInfo().getLocation(); System.out.println("Mouse Clicked at " + px + ", " + py); } // The frame was just unfocused! To make // sure we get the next mouse click, we // need to focus it again! frame.setVisible(true); } } }