当前位置:  开发笔记 > 前端 > 正文

如何知道哪个窗口有焦点以及如何更改它?

如何解决《如何知道哪个窗口有焦点以及如何更改它?》经验,为你挑选了3个好方法。

我想知道如何向X11询问哪些窗口有焦点.如果由于任何原因我自己的应用程序(可能是可见的或不可见)获得焦点,我希望能够让以前的窗口再次获得焦点.

例如,我的应用程序与许多其他应用程序一起运行(例如firefox,gvim,nautilus,...)

假设首先firefox具有焦点,并且用户点击我现在具有焦点的应用程序.我希望我的应用程序再次关注firefox.

有谁知道如何实现这一目标?书籍推荐非常好.

非常感谢.



1> Marten..:

看一下_NET_ACTIVE_WINDOW大多数现代窗口管理器设置的根窗口的值:

xprop -root _NET_ACTIVE_WINDOW

当然,可以使用Xlib库调用获取此值.



2> 小智..:

你可能想要这个XGetInputFocus电话.

Window focused;
int revert_to;

XGetInputFocus(dpy, &focused, &revert_to);

在此片段中,focused将是具有当前输入焦点的窗口,获取键盘事件和鼠标按钮按下.

即使窗口管理器未_NET_ACTIVE_WINDOW在EWMH指定的根窗口上设置属性,这也将起作用.一些窗口管理器,例如dwm和我的9wm,没有设置它.


他还询问"如何改变它","XSetInputFocus"可以做到这一点,例如:`XSetInputFocus(display,window_to_focus,RevertToNone,CurrentTime);`

3> Aiden Bell..:

使用此XQueryTree查找当前活动或最顶层的窗口.

这是一个函数,当给定显示时,它将找到焦点的当前窗口:

static Window
GetCurrWindow(d)
Display *d;
{
Window foo;
Window win;
int bar;

    do{
    (void) XQueryPointer(d, DefaultRootWindow(d), &foo, &win,
        &bar, &bar, &bar, &bar, &bar);
    } while(win <= 0);


#ifdef VROOT
    {
    int n;
    Window *wins;
    XWindowAttributes xwa;

    (void) fputs("=xwa=", stdout);

    /* do{  */
        XQueryTree(d, win, &foo, &foo, &wins, &n);
    /* } while(wins <= 0); */
    bar=0;
    while(--n >= 0) {
        XGetWindowAttributes(d, wins[n], &xwa);
        if( (xwa.width * xwa.height) > bar) {
        win = wins[n];
        bar = xwa.width * xwa.height;
        }
        n--;
    }
    XFree(wins);
    }
#endif
    return(win);
}

http://tronche.com/gui/x/xlib/window-information/XQueryTree.html

我找到了来源:

http://examples.oreilly.com/networksa/tools/xsnoop.c

祝好运

推荐阅读
mobiledu2402851203
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有