- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在使用 WinAPI SetWindowsHookEx
和 OS X 目标-c [NSEvent addLocalMonitorForEventsMatchingMask:handler:]
两者都设置了回调,然后我无休止地运行事件循环,回调在需要时触发。
我将这个钩子(Hook)插入到我的进程/应用程序中(但如果我也可以在系统范围内进行操作会很酷)。当用户进行鼠标组合时,我会跟踪他们,如果组合匹配特定模式,它会阻止最后一个鼠标事件并执行特定功能。
我想知道 x11 等价物是什么?
我发现了这个话题:X11 Mouse Movement Event
但这似乎绝对监视所有事件,而他只是过滤掉了鼠标事件。这也是一种锁定非回调方法,这没关系,因为我正在从专用线程运行此代码。但理想情况下,我更喜欢回调方法,因为我的主线程必须向该线程发送消息,例如关于事件窗口更改的消息,并且如果它卡在循环中,它将永远不会放弃获取事件窗口更改消息。
最佳答案
如果您希望它在全局范围内工作,您可能必须为此修补内核。一些背景。
我不确定 OS X,但 Windows 是一个非常不安全的操作系统。例如,每个进程都可以通过 SetWindowsHookEx
安装 Hook 。并监控鼠标和键盘——它基本上是一个键盘记录器。几年前,没有防病毒工具会报告这一点。我不知道今天怎么样。
但从本质上讲,Windows 是一个协作操作系统。这意味着 GUI 运行计算机。具有控制权的应用程序(= 事件的应用程序)获取所有事件。如果应用程序锁定,Windows 将锁定(鼠标和键盘已失效)。如果您在另一个窗口中单击并且事件应用程序显示“否”,则新窗口不会变为事件状态。我记得做了一些事情来让事情变得更好,但这就是 Windows 过去如此不稳定的原因之一——某些应用程序中的一个错误,整个系统变得有错误。
在 Unix 上,内核并不关心 UI(它带有它自己的问题包)。相反,有一个称为 X 服务器的程序(一个正常进程)。从内核的角度来看,这个程序与其他程序没有任何不同。内核处理鼠标和键盘。如果 X 锁定,键盘仍然可以工作(例如,您可以切换到文本控制台)。
这意味着 X 读取像 /dev/input/mice
这样的设备(合并来自当前连接到您计算机的所有鼠标的所有鼠标事件)。您的键盘位于 /dev/input/by-id/
下方。 .这些设备由内核和 维护。二手 由 X. X 只是这里的一个客户。内核作为控制。
如果一个程序使用 X 库,这意味着它会创建一个到 X 服务器的套接字连接。服务器处理内核设备发送的鼠标和键盘事件。这些变成了XEvent
结构并发送给客户端。渲染发生在服务器中,客户端向服务器发送绘图命令。
这使得从 X 客户端控制鼠标和键盘变得很困难——它离源头很远。如果您创建人为事件,它们会被标记为“合成”并且大多数程序会忽略这些 - 它们是安全威胁。
上面列出的设备只能被 root
读取,所以听用户所做的一切也并不容易。
总而言之,如果您想对 X 显示器上的所有程序执行此操作,您将需要以 root
运行的程序。可能还有一个内核模块,它允许您注入(inject)事件并将它们作为 /dev/input/
下的新事件设备公开.你需要配置 X 来收听你的新设备。即便如此,我认为您不能从其他设备取消事件,只需添加您自己的。
如果您只需要一个应用程序,那么事情就容易多了。首先,您需要为您创建的所有窗口添加一个事件监听器。在处理程序中,您可以分析鼠标移动。使用必要的 Button*Mask
和 *MotionMask
位来获取您需要的事件。
如果您不关心安全性,那么您可以让您的应用程序接受合成事件并注入(inject)您的新事件。问题是 X 没有“取消事件”的概念。您也许可以使用事件传播规则来实现您想要的;请参阅本页上的“设备事件的传播”:http://menehune.opt.wfu.edu/Kokua/Irix_6.5.21_doc_cd/usr/share/Insight/library/SGI_bookshelves/SGI_Developer/books/XLib_PG/sgi_html/ch08.html
您可能还应该阅读第 2 章,其中概述了 X。
还有一件事:X 不是线程安全的。你 不得从主线程外部调用 X 函数。如果你这样做,你会得到错误或你的程序会崩溃。
有关的:
关于x11 - 鼠标事件回调,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32262767/
我正在研究 learnyounode 的 HTTP 客户端作业。 我想知道为什么控制台记录来自response.on(“end”,callback)的数据仅输出预期输出的最后一部分,而控制台记录来自r
我正在尝试创建一个对象列表(在我的示例中为 List),我在其中使用 json 将对象添加到此列表,但该列表仍为空。这是我的代码: public List readCardsFromJson() {
我有一个 JavaScript 函数“print_something”,它在大约 300 个 jsp 帮助页面中实现。我发现这个“print_something”函数必须被纠正。所以我正在寻找一个不更
有 2 个 HTML 下拉列表,一个用于 12 小时时间,一个用于每小时 5 分钟的时间间隔。 .. 1 .. 12 .. 0 .. 55 .. 一直在尝试使用 if/
我有一个 A 类,我打算在它与设备驱动程序交互时将其放入共享库中。 我有一个 B 类,将来可能是 C、D、E...,它将使用共享库中的 A 类。 我想要在类 A 中设置回调函数的功能,以便当特定事件发
我需要能够在处理完 Observable.next() 之后执行回调。 我有一个组件“A”,它有一个主题使用 Subject.next() 发送通知。我有一个组件“B”,它订阅了 Subject.as
我有一张在顶部和底部单元格下方带有阴影的表格(此处使用 Matt Gallagher 的解决方案:http://cocoawithlove.com/2009/08/adding-shadow-effe
有人可以向我解释一下为什么这段代码有效 renderSquare(i) { return ( this.handleClick(i)} /> ); } 但
我可以让两个不同的客户端监听相同的 WCF 回调并让它们都接收相同的数据而不必进行两次处理吗? 最佳答案 不是真的 - 至少不是直接的。你所描述的听起来很像发布/订阅模式。 WCF 服务基本上在任何给
我是 SignalR 的新手,如果这个问题太明显,我深表歉意,但我在文档中找不到任何答案。 这是我的代码。 /*1*/ actions.client.doActionA = function (r
我有这个应用程序,您可以在其中输入一些文本并按下一个按钮,将此文本添加到自定义小部件中。这是代码: import 'dart:core'; import 'package:flutter/materi
我读到当您还想使用模型回调时不能使用 Keras 进行交叉验证,但是 this post表明这毕竟是可能的。但是,我很难将其纳入我的上下文。 为了更详细地探讨这个问题,我正在关注 machinelea
我尝试在重力表单中提交表单失败后运行一些 jQuery 代码,也就是验证发现错误时。 我尝试使用 Ajax:complete 回调,但它根本不触发。 我尝试运行的代码基本上将监听器添加到选择下拉列表中
我有一个 $image,我 .fadeIn 和 .fadeOut,然后 .remove .fadeOut 完成。这是我的代码: $image .fadeIn() .fadeOut(func
我正在处理一个自定义文件路径类,它应该始终执行一个函数 写入相应的系统文件及其文件对象后 关闭。该函数将文件路径的内容上传到远程位置。 我希望上传功能完全在用户的幕后发生 透视,即用户可以像使用其他任
这里是 javascript 新手,所以回调在我的大脑中仍然有点不确定。 我想做的是:给定一个“菜单”,它是一个 objectId 数组,查询与该 objectId 相对应的每个 foodItem,获
我正在学习回调,我编写了以下代码: var http = require('http'); var str = ""; var count = 2; function jugglingAsync(ca
这是我的困境,我有一系列被调用的函数,我正在使用回调函数在它们完成时执行函数。回调返回一个值并且效果也很好,我的问题是当我向回调添加参数时我无法再访问返回值。这是一个有效的例子: function m
This question already has answers here: Explanation of function pointers (4个答案) 上个月关闭。 如何将函数指针作为参数传递
我无法让以下代码工作。假设 ajax 调用有效,并且 msg['username'] 预设为 'john'。我想我对如何将变量传递给回调感到困惑。编辑:我认为我的主要困惑是如何从 Ajax 中获取“m
我是一名优秀的程序员,十分优秀!