检测屏幕上的鼠标移动

我创建了一个MouseMotionDetection类,该类的作用只是检测用户是否将鼠标移至屏幕上的任何位置。

为此,我在类构造函数中创建了一个新的JFrame,其屏幕大小是不可见的,因此基本上我在整个屏幕上观察鼠标的运动。

但是,我有一个奇怪的错误:

以代码的当前形式,一旦激活了此类,我将只检测到一个鼠标移动,而没有其他动作,此后它立即停止工作。但是,如果我在注释中放入将框架backfround设置为0f,0f,0f,0f(透明)的行,然后将其激活,则整个屏幕会变成灰色,并且我会一直跟踪所有鼠标的运动(我可以什么都看不到)。

我真的不明白为什么会发生这种情况,也没有看到相关的问题,也没有在讨论MouseMotion事件的相关javadoc中看到

这是代码:

public class MouseMotionDetection extends JPanel
                implements MouseMotionListener{

public MouseMotionDetection(Region tableRegion, Observer observer){
    addMouseMotionListener(this);
    setBackground(new Color(0f,0f,0f,0f));
    JFrame frame = new JFrame();         
    frame.setUndecorated(true);
    Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
    frame.setSize(screenSize);
    frame.setBackground(new Color(0f,0f,0f,0f));
    frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
    frame.setAlwaysOnTop(true);
    JComponent contentPane = this;
    contentPane.setOpaque(true);
    frame.getContentPane().add(contentPane, BorderLayout.CENTER);
    frame.setVisible(true);
}

@Override
public void mouseDragged(MouseEvent arg0) {

}

@Override
public void mouseMoved(MouseEvent arg0) {
    System.out.println("mouse movement detected");
}
安德鲁·汤普森

完全透明的框架不会收到鼠标事件。

这是使用的替代方法MouseInfo如果应用程序的组件有效。是不可见的(透明),未聚焦或已最小化。

在此处输入图片说明

import java.awt.*;
import java.awt.event.*;
import java.awt.geom.GeneralPath;
import java.awt.image.BufferedImage;
import javax.swing.*;
import javax.swing.border.EmptyBorder;

public class MouseMoveOnScreen {

    Robot robot;
    JLabel label;
    GeneralPath gp;
    Dimension d = Toolkit.getDefaultToolkit().getScreenSize();

    MouseMoveOnScreen() throws AWTException {
        robot = new Robot();

        label = new JLabel();
        gp = new GeneralPath();
        Point p = MouseInfo.getPointerInfo().getLocation();
        gp.moveTo(p.x, p.y);
        drawLatestMouseMovement();
        ActionListener al = new ActionListener() {

            Point lastPoint;

            @Override
            public void actionPerformed(ActionEvent e) {
                Point p = MouseInfo.getPointerInfo().getLocation();
                if (!p.equals(lastPoint)) {
                    gp.lineTo(p.x, p.y);
                    drawLatestMouseMovement();
                }
                lastPoint = p;
            }
        };
        Timer timer = new Timer(40, al);
        timer.start();
    }

    public void drawLatestMouseMovement() {
        BufferedImage biOrig = robot.createScreenCapture(
                new Rectangle(0, 0, d.width, d.height));
        BufferedImage small = new BufferedImage(
                biOrig.getWidth() / 4,
                biOrig.getHeight() / 4,
                BufferedImage.TYPE_INT_RGB);
        Graphics2D g = small.createGraphics();
        g.scale(.25, .25);
        g.drawImage(biOrig, 0, 0, label);

        g.setStroke(new BasicStroke(8));
        g.setColor(Color.RED);
        g.draw(gp);
        g.dispose();

        label.setIcon(new ImageIcon(small));
    }

    public JComponent getUI() {
        return label;
    }

    public static void main(String[] args) throws Exception {
        Runnable r = new Runnable() {
            @Override
            public void run() {
                JPanel ui = new JPanel(new BorderLayout(2, 2));
                ui.setBorder(new EmptyBorder(4, 4, 4, 4));

                try {
                    MouseMoveOnScreen mmos = new MouseMoveOnScreen();
                    ui.add(mmos.getUI());
                } catch (AWTException ex) {
                    ex.printStackTrace();
                }

                JFrame f = new JFrame("Track Mouse On Screen");
                // quick hack to end the frame and timer
                f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                f.setContentPane(ui);
                f.pack();
                f.setLocationByPlatform(true);
                f.setVisible(true);
            }
        };
        SwingUtilities.invokeLater(r);
    }
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何在屏幕上的任何位置检测鼠标位置?

来自分类Dev

屏幕上的鼠标移动分辨率是多少

来自分类Dev

如何从在Kubuntu上用鼠标移动的放大屏幕退出?

来自分类Dev

MouseHook检测鼠标何时移动

来自分类Dev

在nsbezierpath上检测鼠标

来自分类Dev

如何在没有绝对鼠标移动的情况下将鼠标移动到屏幕上的任何位置?

来自分类Dev

如何在按下按钮时检测鼠标在节点上的移动?

来自分类Dev

使用C#将鼠标移动锁定在一个特定的屏幕上

来自分类Dev

Noob here-当我在屏幕上移动鼠标时,我的精灵的pygame动画会更新

来自分类Dev

当鼠标移动到屏幕上的任意位置而不是元素本身时,如何显示div?

来自分类Dev

arduino 可以将鼠标移动到屏幕上的确切位置吗?

来自分类Dev

检测鼠标是否以圆圈方式移动

来自分类Dev

检测鼠标在QWebEngineView上的点击

来自分类Dev

检测鼠标在GUI上的点击

来自分类Dev

使用QMouseEvent记录鼠标在屏幕边缘的移动

来自分类Dev

Pygame-鼠标移动时变换屏幕

来自分类Dev

单击鼠标移动屏幕项目的顺序

来自分类Dev

Bootsfaces在移动设备上处理鼠标按下/鼠标移动

来自分类Dev

Tumblr上的移动设备检测

来自分类Dev

当画布的高度超过屏幕的高度时(滚动条出现时),如何在画布(JavaScript)上测试鼠标检测

来自分类Dev

Robot.mouseMove(1000,1000) 将鼠标移动到屏幕上的随机位置......为什么?

来自分类Dev

在Android上检测屏幕上的颜色

来自分类Dev

检测游戏对象上的鼠标单击

来自分类Dev

Gtk:如何检测EventBox上的鼠标位置?

来自分类Dev

检测游戏对象上的鼠标单击

来自分类Dev

检测鼠标在不可滚动项目上的滚动

来自分类Dev

pygame检测鼠标光标在对象上

来自分类Dev

在屏幕上重新定位鼠标光标

来自分类Dev

整个屏幕上的鼠标释放事件

Related 相关文章

  1. 1

    如何在屏幕上的任何位置检测鼠标位置?

  2. 2

    屏幕上的鼠标移动分辨率是多少

  3. 3

    如何从在Kubuntu上用鼠标移动的放大屏幕退出?

  4. 4

    MouseHook检测鼠标何时移动

  5. 5

    在nsbezierpath上检测鼠标

  6. 6

    如何在没有绝对鼠标移动的情况下将鼠标移动到屏幕上的任何位置?

  7. 7

    如何在按下按钮时检测鼠标在节点上的移动?

  8. 8

    使用C#将鼠标移动锁定在一个特定的屏幕上

  9. 9

    Noob here-当我在屏幕上移动鼠标时,我的精灵的pygame动画会更新

  10. 10

    当鼠标移动到屏幕上的任意位置而不是元素本身时,如何显示div?

  11. 11

    arduino 可以将鼠标移动到屏幕上的确切位置吗?

  12. 12

    检测鼠标是否以圆圈方式移动

  13. 13

    检测鼠标在QWebEngineView上的点击

  14. 14

    检测鼠标在GUI上的点击

  15. 15

    使用QMouseEvent记录鼠标在屏幕边缘的移动

  16. 16

    Pygame-鼠标移动时变换屏幕

  17. 17

    单击鼠标移动屏幕项目的顺序

  18. 18

    Bootsfaces在移动设备上处理鼠标按下/鼠标移动

  19. 19

    Tumblr上的移动设备检测

  20. 20

    当画布的高度超过屏幕的高度时(滚动条出现时),如何在画布(JavaScript)上测试鼠标检测

  21. 21

    Robot.mouseMove(1000,1000) 将鼠标移动到屏幕上的随机位置......为什么?

  22. 22

    在Android上检测屏幕上的颜色

  23. 23

    检测游戏对象上的鼠标单击

  24. 24

    Gtk:如何检测EventBox上的鼠标位置?

  25. 25

    检测游戏对象上的鼠标单击

  26. 26

    检测鼠标在不可滚动项目上的滚动

  27. 27

    pygame检测鼠标光标在对象上

  28. 28

    在屏幕上重新定位鼠标光标

  29. 29

    整个屏幕上的鼠标释放事件

热门标签

归档