gpt4 book ai didi

Linux x11 XGrabKeyboard() 导致键盘被卡住

转载 作者:太空宇宙 更新时间:2023-11-04 09:49:53 33 4
gpt4 key购买 nike

我正在编写一个需要监听用户键盘敲击的程序。

我使用 XGrabKeyboard() 函数,这是我的代码:

XGrabKeyboard(pDisplay, DefaultRootWindow(pDisplay), True, GrabModeAsync, GrabModeAsync, CurrentTime);
XEvent event;
while (true)
{
XNextEvent(pDisplay, &event);
switch (event.type)
{
...
}
}

但它会导致键盘和光标被卡住。

我查了一下man page,只说:“第三个参数指定一个 bool 值,表示键盘事件是否照常上报。”

我尝试了 true 或 false 或第三个参数,第四个和第五个参数的 GrabModeAsync 和 GrabModeSync,但它不起作用。

调用XGrabKeyboard()后,键盘卡住,鼠标点击无响应。

有什么想法吗?

最佳答案

XGrabKeyboard()(如果成功 - 请务必检查返回值),将所有按键事件重定向到您的客户端。

因此,如果 while(true) 中的“...”没有正确处理这些按键事件,或者从未取消抓取(XUngrabKeyboard)或释放同步事件(XAllowEvents,仅适用于 GrabModeSync),那么键盘将似乎锁定了。

bool 参数是 owner_events,它指示是否始终将按键事件报告给提供给 XGrabKeyboard 的窗口,或者将它们报告给他们通常在没有抓取的情况下会去的窗口。通常您需要 False(向抓取窗口报告)。

对于 XGrabKeyboard 的典型用途(我不知道您的用例),您需要的参数是:

  • 抓取窗口 = 您应用中与抓取原因相关的某个窗口
  • owner_events=False 将所有事件发送到该窗口
  • pointer_mode=Async 不乱用指针
  • keyboard_mode=Async 仅重定向所有按键事件并避免需要 AllowEvents
  • time=触发抓取的事件的时间戳,理想情况下,或者通过更改属性并从 PropertyNotify 抓取时间戳而生成的时间戳

但是,这取决于。要给出任何明确的答案,您可能需要发布一个可编译的程序,我认为该错误很可能在您代码的“...”部分。尝试将您的应用程序缩小到一个可能由其他人运行的单文件测试用例。或者解释更多你为什么要捕获,以及你想要在大局中完成什么。

关于Linux x11 XGrabKeyboard() 导致键盘被卡住,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12237755/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com