Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/384.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java MouseListener还检测来自Robot类的点击_Java_Recursion_Minecraft_Mouselistener_Robot - Fatal编程技术网

Java MouseListener还检测来自Robot类的点击

Java MouseListener还检测来自Robot类的点击,java,recursion,minecraft,mouselistener,robot,Java,Recursion,Minecraft,Mouselistener,Robot,我制作了一个程序,当我点击时,它会模拟Robot类的点击。所以我有两次点击,但我点击了一次。我的问题是鼠标听器也会检测到机器人发出的咔哒声,机器人总是触发鼠标听器,它不会停止咔哒声。有人知道怎么解决这个问题吗? 我使用JNativeHook库,这样我就可以监听全局击键。使用java.awt.MouseListener,我只能在窗口处于焦点时检测鼠标输入。 这是我的密码: package de.fastwieac.doubleclicker.main; // imports import org

我制作了一个程序,当我点击时,它会模拟Robot类的点击。所以我有两次点击,但我点击了一次。我的问题是鼠标听器也会检测到机器人发出的咔哒声,机器人总是触发鼠标听器,它不会停止咔哒声。有人知道怎么解决这个问题吗? 我使用JNativeHook库,这样我就可以监听全局击键。使用java.awt.MouseListener,我只能在窗口处于焦点时检测鼠标输入。 这是我的密码:

package de.fastwieac.doubleclicker.main;

// imports
import org.jnativehook.GlobalScreen;
import org.jnativehook.NativeHookException;
import org.jnativehook.mouse.NativeMouseEvent;
import org.jnativehook.mouse.NativeMouseInputListener;
import java.awt.Robot;
import java.awt.event.InputEvent;
import java.util.logging.Level;
import java.util.logging.Logger;

import javax.swing.JOptionPane;
import java.awt.AWTException;

public class Main extends javax.swing.JFrame implements NativeMouseInputListener {

    private static final long serialVersionUID = 1L;

    public Main() {
        initComponents();
    }

    private void initComponents() {

        // create instances
        panel = new javax.swing.JPanel();
        rbtnOn = new javax.swing.JRadioButton();
        rbtnOff = new javax.swing.JRadioButton();
        rbtnLeft = new javax.swing.JRadioButton();
        rbtnRight = new javax.swing.JRadioButton();
        txtKey = new javax.swing.JTextField();
        txtHotkey = new javax.swing.JTextField();
        

        // frame properties
        setLocationRelativeTo(null);
        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
        setTitle("DoubleClicker");
        setResizable(false);
        setSize(new java.awt.Dimension(304, 304));

        // panel properties
        panel.setBackground(new java.awt.Color(0, 204, 204));
        panel.setFont(new java.awt.Font("Segoe UI", 1, 14));

        // radio button rbtnOn properties
        rbtnOn.setFont(new java.awt.Font("Segoe UI", 1, 14));
        rbtnOn.setForeground(new java.awt.Color(0, 0, 0));
        rbtnOn.setText("On");
        rbtnOn.setSelected(true);
        rbtnOn.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                rbtnActionPerformed(evt);
            }
        });

        // radio button rbtnOff properties
        rbtnOff.setFont(new java.awt.Font("Segoe UI", 1, 14));
        rbtnOff.setForeground(new java.awt.Color(0, 0, 0));
        rbtnOff.setSelected(false);
        on = true;
        rbtnOff.setText("Off");
        rbtnOff.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                rbtnActionPerformed(evt);
            }
        });

        // radio button rbtnLeft properties
        rbtnLeft.setFont(new java.awt.Font("Segoe UI", 1, 14));
        rbtnLeft.setForeground(new java.awt.Color(0, 0, 0));
        rbtnLeft.setSelected(true);
        left = true;
        rbtnLeft.setText("Left Click");
        rbtnLeft.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                rbtnActionPerformed(evt);
            }
        });

        // radio button rbtnRight properties
        rbtnRight.setFont(new java.awt.Font("Segoe UI", 1, 14));
        rbtnRight.setForeground(new java.awt.Color(0, 0, 0));
        rbtnRight.setText("Right Click");
        rbtnRight.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                rbtnActionPerformed(evt);
            }
        });

        // txtKey Properties
        txtKey.setEditable(false);
        txtKey.setBackground(new java.awt.Color(0, 204, 204));
        txtKey.setFont(new java.awt.Font("Segoe UI", 1, 14));
        txtKey.setForeground(new java.awt.Color(0, 0, 0));
        txtKey.setText("Key:");
        txtKey.setBorder(null);

        // txtHotkey properties
        txtHotkey.setBackground(new java.awt.Color(0, 204, 204));
        txtHotkey.setFont(new java.awt.Font("Segoe UI", 1, 14));
        txtHotkey.setForeground(new java.awt.Color(0, 0, 0));
        txtHotkey.setText("R");
        txtHotkey.setBorder(null);

        javax.swing.GroupLayout panelLayout = new javax.swing.GroupLayout(panel);
        panel.setLayout(panelLayout);
        panelLayout.setHorizontalGroup(panelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                .addGroup(panelLayout.createSequentialGroup().addContainerGap()
                        .addGroup(panelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                                .addGroup(panelLayout.createSequentialGroup().addGap(85, 85, 85)
                                        .addComponent(txtKey, javax.swing.GroupLayout.PREFERRED_SIZE, 30,
                                                javax.swing.GroupLayout.PREFERRED_SIZE)
                                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                                        .addComponent(txtHotkey, javax.swing.GroupLayout.PREFERRED_SIZE, 13,
                                                javax.swing.GroupLayout.PREFERRED_SIZE)
                                        .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
                                .addGroup(javax.swing.GroupLayout.Alignment.TRAILING,
                                        panelLayout.createSequentialGroup().addGroup(panelLayout
                                                .createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
                                                .addGroup(panelLayout.createSequentialGroup()
                                                        .addComponent(rbtnLeft, javax.swing.GroupLayout.PREFERRED_SIZE,
                                                                98, javax.swing.GroupLayout.PREFERRED_SIZE)
                                                        .addPreferredGap(
                                                                javax.swing.LayoutStyle.ComponentPlacement.RELATED, 45,
                                                                Short.MAX_VALUE)
                                                        .addComponent(rbtnRight, javax.swing.GroupLayout.PREFERRED_SIZE,
                                                                98, javax.swing.GroupLayout.PREFERRED_SIZE))
                                                .addGroup(panelLayout.createSequentialGroup()
                                                        .addComponent(rbtnOn, javax.swing.GroupLayout.PREFERRED_SIZE,
                                                                98, javax.swing.GroupLayout.PREFERRED_SIZE)
                                                        .addPreferredGap(
                                                                javax.swing.LayoutStyle.ComponentPlacement.RELATED,
                                                                javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                                                        .addComponent(rbtnOff, javax.swing.GroupLayout.PREFERRED_SIZE,
                                                                98, javax.swing.GroupLayout.PREFERRED_SIZE)))
                                                .addGap(29, 29, 29)))));
        panelLayout.setVerticalGroup(panelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                .addGroup(panelLayout.createSequentialGroup().addContainerGap()
                        .addGroup(panelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                                .addComponent(rbtnOn).addComponent(rbtnOff))
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addGroup(panelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                                .addComponent(rbtnLeft).addComponent(rbtnRight))
                        .addGap(18, 18, 18)
                        .addGroup(panelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                                .addComponent(txtKey, javax.swing.GroupLayout.PREFERRED_SIZE,
                                        javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                                .addComponent(txtHotkey, javax.swing.GroupLayout.PREFERRED_SIZE,
                                        javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                        .addContainerGap(17, Short.MAX_VALUE)));

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING).addComponent(
                panel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE));
        layout.setVerticalGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING).addComponent(
                panel, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE,
                javax.swing.GroupLayout.PREFERRED_SIZE));

        pack();
    }

    private void rbtnActionPerformed(java.awt.event.ActionEvent e) {

        if (e.getSource().equals(rbtnOn)) {
            rbtnOn.setSelected(true);
            rbtnOff.setSelected(false);
            on = true;
            if (txtHotkey.getText().length() > 1) {
                txtHotkey.setText("R");
            }
            txtHotkey.setText(txtHotkey.getText().toUpperCase());
        }

        if (e.getSource().equals(rbtnOff)) {
            rbtnOff.setSelected(true);
            rbtnOn.setSelected(false);
            on = false;
        }

        if (e.getSource().equals(rbtnLeft)) {
            rbtnLeft.setSelected(true);
            rbtnRight.setSelected(false);
            left = true;
        }

        if (e.getSource().equals(rbtnRight)) {
            rbtnRight.setSelected(true);
            rbtnLeft.setSelected(false);
            left = false;
        }
    }

    public static void main(String args[]) {

        Logger l = Logger.getLogger(GlobalScreen.class.getPackage().getName());
        l.setLevel(Level.OFF);

        try {
            GlobalScreen.registerNativeHook();
        } catch (NativeHookException e) {
            e.printStackTrace();
        }

        
        GlobalScreen.addNativeMouseListener(new Main());

        // JOptionPane
        JOptionPane.showMessageDialog(null, "Use only 1 Key as Hotkey!");

        try {
            for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) {
                if ("Nimbus".equals(info.getName())) {
                    javax.swing.UIManager.setLookAndFeel(info.getClassName());
                    break;
                }
            }
        } catch (ClassNotFoundException ex) {
            java.util.logging.Logger.getLogger(Main.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (InstantiationException ex) {
            java.util.logging.Logger.getLogger(Main.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (IllegalAccessException ex) {
            java.util.logging.Logger.getLogger(Main.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (javax.swing.UnsupportedLookAndFeelException ex) {
            java.util.logging.Logger.getLogger(Main.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        }

        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                new Main().setVisible(true);
            }
        });

    }

    private boolean left;
    private boolean on;
    private Robot robot;
    private javax.swing.JPanel panel;
    private javax.swing.JRadioButton rbtnLeft;
    private javax.swing.JRadioButton rbtnOff;
    private javax.swing.JRadioButton rbtnOn;
    private javax.swing.JRadioButton rbtnRight;
    private javax.swing.JTextField txtHotkey;
    private javax.swing.JTextField txtKey;

    @Override
    public void nativeMouseClicked(NativeMouseEvent e) {
        
    }

    @Override
    public void nativeMousePressed(NativeMouseEvent e) {
        
        if (e.getButton() == NativeMouseEvent.BUTTON1 & on == true & left == true) {
            robot.mousePress(InputEvent.BUTTON1_DOWN_MASK);
            robot.mouseRelease(InputEvent.BUTTON1_DOWN_MASK);

        }
        if (e.getButton() == NativeMouseEvent.BUTTON3 & left == false & on == true) {
            robot.mousePress(InputEvent.BUTTON3_DOWN_MASK);
            robot.mouseRelease(InputEvent.BUTTON3_DOWN_MASK);
        }
    }

    @Override
    public void nativeMouseReleased(NativeMouseEvent e) {

    }

    @Override
    public void nativeMouseDragged(NativeMouseEvent e) {

    }

    @Override
    public void nativeMouseMoved(NativeMouseEvent e) {

    }

}

使用布尔值,比如“单击”怎么样?每次单击触发时,您都会切换它,并且只有在其为真时才会触发另一个


因此,您单击–>其为真,机器人单击–>其为假,在您再次单击之前不会再次单击?

使用布尔值,如“单击”如何?每次单击触发时,您都会切换它,并且只有在其为真时才会触发另一个


所以你点击–>它是真的,机器人点击–>它是假的,在你再次点击之前不会再点击?

我已经有一段时间没有用过这个了。。
getSource()
方法能否帮助您区分单击和java.awt.Robot的单击?如果没有,你需要一个变通办法。就像用鼠标左键点击自己,让机器人总是右键点击。(希望我正确理解了这个问题)。您正在询问如何修复实现中的“bug”。我建议将“机器人”鼠标按键包装在调用方法中。话虽如此,我很想知道你的应用程序做了什么,让你使用“机器人”实现它,并且需要在桌面上的任何地方听鼠标点击,而不仅仅是在你的应用程序的
JFrame
。我为Minecraft做这件事。在Minecraft中点击次数越多,击退次数越少。这个应用程序复制了我的点击。所以基本上你是想作弊。我有一个建议。用于绑定未使用的键,如F12,以便在按F12时模拟多次鼠标单击。顺便说一句,你不需要实施我的建议。为什么我不需要JNativeHook?是的,我试着在Minecraft中作弊,不,我不想像你说的那样做,因为我仍然想点击。我已经有一段时间没有使用这个了。。
getSource()
方法能否帮助您区分单击和java.awt.Robot的单击?如果没有,你需要一个变通办法。就像用鼠标左键点击自己,让机器人总是右键点击。(希望我正确理解了这个问题)。您正在询问如何修复实现中的“bug”。我建议将“机器人”鼠标按键包装在调用方法中。话虽如此,我很想知道你的应用程序做了什么,让你使用“机器人”实现它,并且需要在桌面上的任何地方听鼠标点击,而不仅仅是在你的应用程序的
JFrame
。我为Minecraft做这件事。在Minecraft中点击次数越多,击退次数越少。这个应用程序复制了我的点击。所以基本上你是想作弊。我有一个建议。用于绑定未使用的键,如F12,以便在按F12时模拟多次鼠标单击。顺便说一句,你不需要实施我的建议。为什么我不需要JNativeHook?是的,我试着在Minecraft中作弊,不,我不想像你说的那样做,因为我仍然想点击。谢谢你帮助了我,谢谢你帮助了我