【问题标题】:Listen to mouse clicks on whole system (not on a JFrame etc.)聆听整个系统上的鼠标点击(而不是 JFrame 等)
【发布时间】:2011-06-05 03:37:13
【问题描述】:

我想编写一个响应鼠标点击的小代码。但似乎唯一的方法是听取对 Java 组件的点击。直接监听所有点击会很棒。

真的有可能在 Java 中实现吗?

提前致谢!

更新:

发现,它需要一个通过 JNI 和一些 C 编码的钩子。

更多信息 http://www.jotschi.de/?p=90

最好的问候, 首先

【问题讨论】:

    标签: java event-handling click mouse listener


    【解决方案1】:

    不要这么认为,因为您正在运行沙箱。

    【讨论】:

      【解决方案2】:

      深思熟虑:使用 Java 中的 Point 来检测点击发生的位置。 http://download.oracle.com/javase/1.4.2/docs/api/java/awt/Point.html

      诚然,我之前只使用过一次它来检测表中的行,但它似乎最接近我找到的答案。:

      public void mouseClicked(MouseEvent e) {
          JTable target = (JTable)e.getSource();
          //get the coordinates of the mouse click
          Point p = e.getPoint();
          //get the row index that contains that coordinate
          row= target.rowAtPoint(p);
      }
      

      很抱歉,如果这不是您要找的东西,否则,单击组件是唯一的方法。什么是替代方法——点击容器?好吧,这没有任何意义吗?

      【讨论】:

        【解决方案3】:

        据我所知,没有简单的方法可以实现您想要的。但是您想要的可以完成..对于完成这项任务的现代方法,我建议您检查 java.awt.Dialog show 方法..

        package mouseclickevent;
        import java.awt.AWTEvent;
        import java.awt.Component;
        import java.awt.EventQueue;
        import java.awt.MenuComponent;
        import java.awt.Toolkit;
        import java.awt.event.ActionEvent;
        import java.awt.event.ActionListener;
        
        import java.awt.event.MouseEvent;
        import java.lang.reflect.Method;
        
        import javax.swing.JButton;
        import javax.swing.JFrame;
        import javax.swing.JPanel;
        import javax.swing.JTextField;
        
        
        public class FrmEvent extends JFrame {
            public FrmEvent(){
                JPanel panel = new JPanel();
                getContentPane().add(panel);
                JButton btn = new JButton("Test");
                panel.add(btn);
                panel.add(new JTextField("Test"));
                btn.addActionListener(new ActionListener() {
        
                    @Override
                    public void actionPerformed(ActionEvent e) {
                        FrmEvent frm = new FrmEvent();
                        frm.setBounds(300,300,  200, 200);
                        frm.show();
        
                    }
                });
        
            }
        
            private void consumeEvents() {
                try {
                    if (Thread.currentThread().getClass().getName().endsWith(
                    "EventDispatchThread")) {
                        EventQueue eq = null;
                        eq = Toolkit.getDefaultToolkit().getSystemEventQueue();
        
                        if (eq == null) {
                            return;
                        }
                        while (isVisible() || isShowing()) {
                            AWTEvent event = eq.getNextEvent();
                            Object src = event.getSource();
                            Class kActiveEvent= Class.forName("java.awt.ActiveEvent");
                            if (kActiveEvent != null) {
                                if (kActiveEvent.isInstance(event)) {
                                    Method m;
                                    Class types[] = {};
                                    Object args[] = {};
                                    m = kActiveEvent.getMethod("dispatch",  types);
        
                                    if (m != null) {
                                        m.invoke(event, args);
                                        continue;
                                    }
                                }
                            }
                            dispatchEvent(src, event);
                        }
                    }
        
                }
                catch (Exception e) {
                    e.printStackTrace();
                    throw new RuntimeException(e);
                }
            }
            private  void dispatchEvent(Object src, AWTEvent event) {
                if (event.getID()== MouseEvent.MOUSE_CLICKED) {
                    System.out.println("mouseClicked");
                }
                if (src instanceof Component) {
                    ( (Component) src).dispatchEvent(event);
                } else if (src instanceof MenuComponent) {
                    ( (MenuComponent) src).dispatchEvent(event);
                }
            }
        
            public void show(){
                super.show();
                consumeEvents();
            }
        
            public static void main(String[] args) {
        
                FrmEvent frm = new FrmEvent();
                frm.setBounds(300,300,  200, 200);
                frm.show();
        
            }
        }
        

        【讨论】:

          【解决方案4】:

          如果你愿意使用第三方库是完全可能的 - JNativeHook

          它使用 JNI 提供这些功能,这在纯 Java 应用程序中是不可能的。

          【讨论】:

          • 完美,你拯救了我的一天。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2016-05-15
          • 1970-01-01
          • 1970-01-01
          • 2013-11-13
          • 2021-10-14
          • 2021-05-12
          • 2012-10-16
          相关资源
          最近更新 更多