如何将鼠标限制在多显示器系统上的特定显示器上?

时间:2015-02-19 20:38:02

标签: python qt pyside

我有一个多监视器系统,运行两个Python3.x Qt应用程序(PySide)。我成功指定了哪个应用程序在哪个监视器上运行。一个应用程序(以及一个监视器)是用户输入终端(基本上是自助服务终端),而另一个应用程序(以及另一个监视器)仅用于显示信息。

如何将鼠标限制在自助服务终端显示器上?我知道我可以禁用'第二个应用程序,忽略鼠标和键盘事件,但我真的宁愿将实际的鼠标移动限制在第一个显示器上。

这是必须使用低级Windows(Windows 7)函数的东西,还是我可以在我的应用程序中用Python实现某些东西来处理它?<​​/ p>

此处的任何意见或指导都将非常感谢!

谢谢!

1 个答案:

答案 0 :(得分:2)

编辑:最初提出这个答案作为对评论的回应,要求我已经碰巧编写了一些代码,这些代码不是在python中而是完成了目标。该脚本更下来,这是一个python脚本,只适用于Windows,但将使用win32api执行相同的功能。

import win32api

# set these to whatever you want
xMin = 300
xMax = 800

running = True
while running:
        x, y = win32api.GetCursorPos()
        if x < xMin:
                win32api.SetCursorPos((xMin,y))
        elif x > xMax:
                win32api.SetCursorPos((xMax,y))

发布@PavelStrakhov。这是一个java脚本,它将光标保持在x坐标的某个范围内(跨平台)。

要运行它,请将以下代码保存为mouseWatcher.java,运行$ javac mouseWatcher.java,然后运行$ java mouseWatcher即可启动它。

要小心。如果你运行它并且不知道如何在没有鼠标的情况下停止它并且你的设定范围不允许你将鼠标移动到你需要的地方,你赢了不能阻止它。 : - )

/* to control the mouse */
import java.awt.AWTException;
import java.awt.Robot;

/* to get the mouse position */
import java.awt.MouseInfo;

public class mouseWatcher {

    public static void main(String[] args) {
        /* the minimum and maximum x positions the cursor is allowed at */
        int xMin = 200;
        int xMax = 800;

        /* repeat forever */
        boolean running = true;
        while (running) {
            /* get the current cursor position */           
            int[] position = cursorGetPos();

            /* if they try to move it to the left of the acceptable area */
            if (position[0] < xMin)
                /* move the cursor the left most acceptable point */
                mouseMove(xMin, position[1]);

            /* if they try to move it to the right of the acceptable area */
            else if (position[0] > xMax)
                /* move the cursor to the right most acceptable point */
                mouseMove(xMax, position[1]);
        }
    }

    private static void mouseMove( int x, int y) {
        try {
            Robot r = new Robot();
            r.mouseMove(x, y);
        } catch (AWTException e) {
            throw new RuntimeException(e);
        }
    }

    private static int[] cursorGetPos() {
        int X = MouseInfo.getPointerInfo().getLocation().x; 
        int Y = MouseInfo.getPointerInfo().getLocation().y; 
        int[] coords = {X,Y};
        return coords;
    }

    private static void sleep( int milliseconds ) {
        try {
            Robot r = new Robot();
            r.delay(milliseconds);
        } catch(AWTException e) {
            throw new RuntimeException(e);
        }
    }
}