簡體   English   中英

我的xlib代碼可以監聽鍵盤事件但是對於某些窗口它會失敗

[英]My xlib code can listen to keyboard events but it fails for some windows

我有這個代碼來監聽活動窗口的鍵盤事件:

#include<X11/Xlib.h>
#include<stdio.h>
#include<stdlib.h>
#include <iostream>
#include <thread>
using namespace std;



#define IR_MODE 8192
#define SHIFT_MODE 16
#define US_MODE 0

static int ErrorHandler (Display *display, XErrorEvent *error)
{
    cout<< "An error ocurred. We don't know anything.";
    return 0;
}    

int main()
{
    Display *d = XOpenDisplay(0);
    if(d == 0)
    {
        cout<< "Cannot open display\n";
        exit(0);
    }
    Window root = DefaultRootWindow(d);


    XSetErrorHandler(ErrorHandler);

    Window current_window;
    int rev;
    XGetInputFocus(d,&current_window,&rev);

    XSelectInput(d,current_window, KeyPressMask | KeyReleaseMask | FocusChangeMask);

    while(true) 
    {
        XEvent e;
        XNextEvent(d, &e);
        switch(e.type)
        {
            case FocusOut:
                XGetInputFocus(d,&current_window,&rev);
                if(current_window == PointerRoot || current_window == None)
                {
                    current_window = root;
                }
                XSelectInput(d,current_window,  KeyPressMask | KeyReleaseMask | FocusChangeMask);
                break;
            case KeyPress:
            {                   
                cout<< "key pressed\n";
                break;
            }
            case KeyRelease:
                cout<< "key released\n";
                break;
        }
    }    
    XCloseDisplay(d);//*/
}

它適用於許多窗戶。 但它失敗了一些窗口,特別是對於gnome應用程序,例如nautilus。 為什么會發生這種情況?如何解決問題?

該程序只是試圖在不干擾任何東西的情況下聽鍵盤。 好像鍵盤正在被點擊一樣:程序不打算丟失語言布局信息。 當按下某個鍵時,會選擇一些信息,包括ASCII碼,並根據語言布局將其附加到鍵事件,然后發送鍵事件。 該程序需要關鍵事件及其附帶的信息。 所以該程序並不打算采用Grab鍵盤。 它不關心活動或聚焦窗口。 它只是試圖聽到鍵,即使程序的窗口沒有活動。 有些程序會定期檢查XQueryKeymap ,但我不打算使用它。 因為它耗盡了CPU,然后它不僅僅是一個公平的傾聽者。 此外,如果檢查不頻繁,某些鍵可能會逃脫。

我猜你的程序不適用於使用xinput2的GTK3窗口。 如果沒有--disable-xinput構建GTK3,情況就是如此。

AFAIK XSelectInput()不能與xinput2一起使用,這樣的窗口需要XISelectEvents()

查看Mutter源代碼中的meta_core_select_events()函數。 它適用於xinput2和傳統窗口。 這個補丁也許有幫助。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM