微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何获取鼠标相对于终端窗口的位置?

如何解决如何获取鼠标相对于终端窗口的位置?

如何在 Linux 上获取鼠标相对于终端的位置? 这是我目前所拥有的:

use std::ptr;
use x11::xlib;

fn main() {
    unsafe {
        let display = xlib::XOpendisplay(ptr::null());

        if display.is_null() {
            panic!("XOpendisplay Failed");
        }

        let mut root_return = 0;
        let mut child_return = 0;
        let mut root_x_return = 0;
        let mut root_y_return = 0;
        let mut win_x_return = 0;
        let mut win_y_return = 0;
        let mut mask_return = 0;

        let screen = xlib::XDefaultScreen(display);
        let window = xlib::XRootwindow(display,screen);

        xlib::XQueryPointer(
            display,window,&mut root_return,&mut child_return,&mut root_x_return,&mut root_y_return,&mut win_x_return,&mut win_y_return,&mut mask_return,);
        // root_x_return and root_y_return are the same as win_x_return and win_y_return
        dbg!(root_x_return,root_y_return,win_x_return,win_y_return,);
    }
}

它给了我全局鼠标在整个屏幕上的位置。我该怎么做才能获得仅与当前终端窗口相关的输出?所以 0,0 从第一个终端单元像素开始。

解决方法

看起来您正在使用 XRootWindow() 获取根窗口,然后将其传递给 XQueryPointer() 作为获取相对鼠标坐标的窗口。在这种情况下,您会期望 root_return 和 win_return 值相同。

如果您创建了一个新的 X 窗口,并将其传递给 XQueryPointer(),那么对于 win_*_return 值,您应该获得相对于该新窗口而不是根窗口的坐标。

获取当前终端窗口有点棘手,因为它实际上由另一个进程(运行 shell 的终端进程)所有。您从终端窗口启动的进程正在通过操作系统发送和接收文本,并且无法直接访问终端进程或其窗口。您可能会找到终端的进程 id,然后找到属于该进程的 X 窗口 id,但这绝非易事

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。