XSelectInput 不适用于 ButtonPressEvents,怎么办?

2023-12-19

我正在用 C 语言编写一个简单的程序,我想捕获正在发生的所有鼠标和键盘事件。 我尝试使用“XGrabPointer”,但它会导致锁定屏幕,并且我无法转到其他应用程序。 我尝试使用“XSelectInput()”,现在我成功接收键盘事件,但没有收到任何鼠标单击事件。

知道我该怎么做吗?

代码片段如下:

#include <stdio.h>
#include <stdlib.h>
#include <X11/Xlib.h>
#include <X11/Xutil.h>
#include <X11/keysym.h>

int main(int argc, char **argv)
{
   Display *dpy;
   Window root;
  unsigned long event_mask;
    event_mask = FocusChangeMask | KeyPressMask | KeyReleaseMask | ButtonPressMask  | ButtonReleaseMask;
    if((dpy = XOpenDisplay(NULL)) == NULL) {
        perror(argv[0]);
        exit(1);
    }
dpy = XOpenDisplay(NULL);
root = XDefaultRootWindow(dpy);

int state;
XWindowAttributes attributes;

XGetInputFocus(dpy,&root,&state);
printf("window id = %d\n"); 
XSelectInput(dpy,root,event_mask);


XEvent ev;
   while(1) {


      XNextEvent(dpy, &ev);
    if(ev.type==ButtonRelease){
    printf("button release\n");
    }

      if (ev.type== KeyPress) {
    printf("keypress event\n");
      }


  }

 return 0;

}

当您使用根窗口时,可能还有其他东西获取事件,为了确保您获得所有事件,您需要抓住鼠标,但没有其他东西会获取事件,因此您需要一种退出方式,如 q 键这个例子:

#include <stdio.h>
#include <stdlib.h>
#include <X11/Xlib.h>
#include <X11/Xutil.h>
#include <X11/keysym.h>

int main(int argc, char **argv)
{
    Display *dpy;
    Window root;
    unsigned long event_mask;
    event_mask = KeyReleaseMask | ButtonReleaseMask;
    if((dpy = XOpenDisplay(NULL)) == NULL) {
        perror(argv[0]);
        exit(1);
    }
    dpy = XOpenDisplay(NULL);
    root = XDefaultRootWindow(dpy);

    XGrabPointer(dpy, root, False, ButtonReleaseMask, GrabModeAsync, 
         GrabModeAsync, None, None, CurrentTime);

    int state;
    XWindowAttributes attributes;

    XGetInputFocus(dpy,&root,&state);
    printf("window id = %d\n"); 
    XSelectInput(dpy,root,event_mask);


    XEvent ev;
    while(1) {


    XNextEvent(dpy, &ev);
    printf("Type: %d\n", ev.type);

    if(ev.type==ButtonRelease){
        printf("button release\n");
    }

    if (ev.type== KeyRelease) {
        printf("keypress event\n");
        if (XLookupKeysym(&ev.xkey, 0) == XK_q) {
        exit(0);
        }

    }


    }

    return 0;

}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

XSelectInput 不适用于 ButtonPressEvents,怎么办? 的相关文章

  • Xlib Programming Manual

    最近看了王垠 写的那篇清华退学的文章 xff0c 看到了他研究linux的过程 xff0c 文中提到了x Windows 我也总想搞一搞这个东西 xff0c 但是不知从何入手 它推荐这本书Xlib Programming Manual xf
  • Xlib:XGetWindowAttributes 始终返回 1x1?

    我想要当前聚焦窗口的宽度和高度 窗口的选择就像一个魅力 而高度和宽度是always返回 1 include
  • 在 Xlib 中捕获按钮事件,然后将事件传递给客户端

    我正在开发一个窗口管理器 主要是作为练习 但我遇到了一个问题 我希望能够将单击的窗口提升到堆栈顶部 目前 我在 Button1 和 ControlMask 上使用 XGrabButton 来允许移动窗口 当我按住 Ctrl 键并单击窗口时
  • 指针运动。为什么数字这么高?为什么它以块而不是恒定流的形式打印信息?

    你好 我正在尝试编写一个程序 需要报告每个鼠标运动的位置 我已经打电话给XSelectInput 函数与PointerMotionMask面具 一切似乎都正常 但打印后的数字不会在每次移动后出现 它们以块的形式出现 并且也以块的形式出现ev
  • X11中的截图

    使用 Xlib 库可以使用哪些函数来截取 X11 桌面的屏幕截图 我更喜欢一种比获取单个像素更有效的方法 Thanks X11中截屏的 标准工具是使用 xwd root gt myscreen xwd 然后 转换为 pnm xwd2pnm
  • Xlib:以最小化或最大化状态创建窗口

    是否可以使用 Xlib 创建最大化或最小化状态的窗口 如果是这样 我将如何去做呢 像这样的东西 XEvent xev Atom wm state XInternAtom dpy NET WM STATE False Atom max hor
  • 如何将XImage保存为位图?

    我正在尝试创建 JNI C 库来捕获桌面视频 帧 第一步是简单地制作桌面屏幕截图 代码是 include
  • 抓住键盘不允许改变焦点

    一旦我使用display grab keyboard 似乎没有其他窗口知道自己的焦点 随着键盘抓取运行 我可以选择其他窗口 甚至向它们发送按键事件 但如果此窗口是文本输入 则不会有闪烁的光标 我读过一些关于抓取键盘生成焦点事件的内容 但这并
  • Xlib XGetWindowProperty 返回零项

    我在读取某些 XWindow ICCCM 属性时遇到问题 问题实际上是当我尝试读取 NET WM STATUS 属性时 我正在使用的功能是 int get property value Display display Window wind
  • 如何在 Ubuntu VPS GNOME 环境下为 TightVNC 正确配置 xstartup 文件

    我想通过 VNC 使用 GNOME 环境来访问我的 Ubuntu 16 10 VPS Contabo 但是我仍然面临一些到目前为止无法解决的问题 为了安装和配置软件 我运行了以下命令 sudo apt get install ubuntu
  • 将 pnglib 中的数据显示为 ximage

    我需要导入 PNG 并将其显示在 Motif 应用程序的屏幕上 由于我自己最清楚的原因 我不想使用超出需要的库 并且我想只使用 Motif 和 pnglib 我已经为此奋斗了几天 我想放下我的骄傲并寻求一些帮助 此屏幕截图显示了问题 htt
  • 如何使用 xlib 和 glx 创建具有透明背景的支持 OpenGL 的窗口

    我想创建一个具有透明背景的窗口 然后使用 OpenGL 在其上渲染一些内容 我不想使用捕捉窗口后面的任何内容然后将其绘制为背景的技巧 我想要真正的透明度 我正在运行合成管理器 我没有使用任何 GUI 库 GTK QT 只是原始的 xlib
  • 使用 XCB 检测窗口焦点变化

    我正在使用 XCB 编写一个程序 需要检测窗口何时获得或失去焦点 到目前为止我已经有了这个 但它只是挂在xcb wait for event调用 永远不会进入循环 我在这里缺少什么来获取根事件 或者我的做法完全错误 有比听根音更好的方法吗
  • 使用 Xlib 在 python 中获取窗口位置和大小

    我需要找到窗口的位置和大小 但我不知道如何找到 例如 如果我尝试 id get geometry id is Xlib display Window 我得到这样的东西 data height 2540 width 1440 depth 24
  • 单击透明 xlib 窗口

    我有一个透明的 类似水印的应用程序 它是用 C 语言的 XLib 编写的 目前 如果您单击应用程序上的任何位置 什么也不会发生 但我希望它将鼠标输入传递到其下方的任何内容 例如如果您单击 X 关闭应用程序下方的窗口 它应该关闭应用程序 而不
  • 使用 Xlib 捕获鼠标

    我想编写一个简单的 Xlib 程序来改变鼠标行为 举个例子 反转垂直移动 我在捕获事件时遇到问题 我想要代码 捕获控制器位置的变化 我向上移动鼠标 MotionEvent 计算新的光标位置 new x difference x 设置新的光标
  • 如何在 Linux 中检测通过 GUI 登录的用户

    我想在我的程序中捕获通过 GUI 登录的用户名 我的程序作为守护进程从 root 登录运行 如果非 root 用户通过 GUI 登录 我的程序应该会收到通知 我正在粘贴我当前的程序 该程序调用一个 perl 脚本 利用系统调用来检查当前登录
  • Xlib ARGB 窗口图标

    我有一个ARGB图像数据 我希望将我的窗口图标设置为该数据 经过几个小时的搜索后 我仍然处于起点 手头一无所有 我知道我需要为图像数据创建一个像素图和 可能是 另一个用于掩码的像素图 并使用提示来提示窗口管理器 但是 我不知道如何设置 32
  • 解析 Rust FFI 中的联合结构

    我在解析 c union 结构 XEvent 时遇到问题 我正在 Rust 中试验 Xlib 和 X Record Extension 我生成 ffi 绑定Rust 绑定根 https github com crabtw rust bind
  • Python3 中使用 Gtk 和 XLib 的全局热键

    我的 X System 应用程序保留在后台 并在面板中作为指示器 并且每当用户按下某个键时都应该弹出 无论活动窗口是什么 类似于菜单应用程序 尝试了以下方法 在 Linux 上用 python 监听全局组合键 https stackover

随机推荐

  • 我们有什么钩子可以在应用程序退出时终止工作线程

    我正在从应用程序的 主 线程生成新的工作线程 只要应用程序处于活动状态 这些线程就不断需要执行某些操作 而且 当应用程序退出时 我确实希望正确清理所有工作线程 无论这意味着什么 为了做到这一点 生命周期方法是唯一的地方吗 应用程序退出时是否
  • 将快捷方式绑定到命令面板命令?

    我刚刚安装了一个名为 CodeSniffer http soulbroken co uk code sublimephpcs 的插件 我想将命令面板中的其中一个命令链接到键盘快捷键 因为我经常使用它 有什么简单的方法可以做到这一点吗 或者我
  • Kendo UI Dropdown,使下拉面板比控件更宽

    在 Kendo UI Dropdown 中 是否可以使下拉面板比控件更宽 另一种可能的方法 var dropdownlist titles data kendoDropDownList set width of the drop down
  • R 中按组的组合

    我有一个关于按组组合的问题 我的迷你样本如下所示 sample lt data frame group c a a a a b b b number c 1 2 3 2 4 5 3 如果我应用以下功能combn对于数据框 它给出了以下结果
  • Flask Web 应用程序的 CSS 问题

    我无法正确输出 CSS 我的网页都是无样式的 这是我所有模板中的链接 我究竟做错了什么 为了让它工作 我需要对 Flask 做些什么特别的事情吗 我已经尝试和改变了大约半个小时 但似乎无法做到正确 总结一下 如何使用 Flask 做 CSS
  • 将“e.target”与 jQuery 对象进行比较

    我想做的事 clickedObject someDiv returns true or false 我尝试过的 e target selector returns a false negative 我的解决方法 e target attr
  • 如何在 BootstrapVue 元素上使用 Vue Test Utils 触发事件?

    这个问题让我很困难 我不明白如何制作Vue 测试工具 and BootstrapVue一起玩得很开心 一个最小的例子如下所示 MyComponent vue
  • Python 日志记录:使用毫秒时间格式

    默认情况下logging Formatter asctime s 使用以下格式打印 2011 06 09 10 54 40 638 其中 638 是毫秒 我需要将逗号更改为点 2011 06 09 10 54 40 638 要格式化时间 我
  • forEach 循环未根据需要更新数组

    我正在尝试循环 consoleOuputParamsOBJ 并更新我的 taskparamscompiled 对象列表中的记录 所需输出 process00x00 i D Code UnitTest ConsoleApp 1 00x00 p
  • 如何检查列是否等于可以为空的变量

    我有一个表 其中包含允许 null 或空值的 varchar 列 我正在编写一个存储过程 其中包含一个可以分配给空值或常规字符串 非空 的变量 它的定义如下 declare myvar varchar 50 现在我正在尝试编写一个查询 该查
  • Rust 中的(嵌套)Vec 是否可以进行模式匹配?

    一个库向我提供了一个我想要匹配的深度嵌套的数据结构 它包含Vec内部 我希望像注释掉的行之一一样起作用 struct Foo bar Vec
  • 带延迟的顺序 Promise 循环

    我正在尝试按顺序加载一组 请求 每个请求之间由延迟分隔 我正在使用承诺 但由于某些原因 我在并行而不是按顺序执行请求时遇到问题 我如下编写了一些测试代码 有用 它发出请求 处理请求 超时 3 秒 然后转到第二个请求 var batches
  • 如何将我的 godaddy 域名链接到 Windows Azure [关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 我四处搜寻 但仍然找不到任何有关如何执行此操作的信息 理想情况下 我想知道如何链接多个域名 因为我现在使用 SDK 1 3 有人对如何执行此操作有任何
  • 视频上传并在 Django 网站上显示

    我有一个上传视频的模型 我想在浏览器中显示相同的视频 但不知何故我无法做到 请帮助我 我制作了一个名为 部署 的应用程序 我在其中上传视频并保存它 请告诉我哪里做错了以及应该做什么 我希望上传的视频应该显示在页面上 并且应该有一个下载选项
  • 为什么我安装 rmagick 时遇到问题

    在 Ruby 1 8 7 和 Rails 2 3 5 上我得到 gem install rmagick ERROR Error installing rmagick ERROR Failed to build gem native exte
  • SQL语法区分大小写吗?

    SQL 区分大小写吗 我用过MySQL https en wikipedia org wiki MySQL and SQL 服务器 https en wikipedia org wiki Microsoft SQL Server这两者似乎都
  • 什么是 uber JAR 文件?

    我正在阅读 Maven 文档并偶然发现了这个名字uber jar 一个是什么意思uber jar是什么意思以及它的特点 优点是什么 ber德语单词是above or over 它实际上与英语同源over Hence in this cont
  • 如何匹配小于或等于100的数字?

    我想匹配一个小于或等于 100 的数字 它可以是 0 100 之间的任何数字 但正则表达式不应该匹配大于 100 的数字 如 120 130 150 999 等 Try this b 0 1 9 0 9 100 b 解释 b Assert
  • PHP 致命错误:调用未定义的函数 mysqli_stmt_get_result()

    我不断收到错误 PHP Fatal error Call to undefined function mysqli stmt get result 我正在使用 PHP 版本 5 6 并在我的托管提供商 c 面板中启用了扩展 mysqlind
  • XSelectInput 不适用于 ButtonPressEvents,怎么办?

    我正在用 C 语言编写一个简单的程序 我想捕获正在发生的所有鼠标和键盘事件 我尝试使用 XGrabPointer 但它会导致锁定屏幕 并且我无法转到其他应用程序 我尝试使用 XSelectInput 现在我成功接收键盘事件 但没有收到任何鼠