- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
所以我正在研究 Gtk/X11/Linux app将屏幕捕获到 .gif 并且停止捕获的方法之一是按键(Esc、Space 或 End)。您也可以使用超时。但是,要实现按键以结束捕获,我必须能够捕获键,这样即使我的窗口没有焦点,我也可以获得事件(它在捕获过程中实际上是不可见的)。我相信XGrabKey是此任务的正确 X11 函数:
Window w = Gtk::gdk_x11_drawable_get_xid(Gtk::gtk_widget_get_window(Handle()));
KeyCode kc = XKeysymToKeycode(Gtk::gdk_display, HotKeyCode);
int r = XGrabKey( Gtk::gdk_display,
kc,
0 /* modifiers */,
w /* grab_window */,
TRUE /* owner_events */,
GrabModeAsync /* pointer_mode */,
GrabModeAsync /* keyboard_mode */);
printf("XGrabKey(%p, 0x%x/%x)=%i\n", w, HotKeyCode, kc, r);
XGrabKey(0x3e00003, 0xff1b/9)=1
int x_err_callback(Display *d, XErrorEvent *e)
{
char msg[256];
XGetErrorText(d, e->error_code, msg, sizeof(msg));
printf("X11Error %d (%s): request %d.%d\n",
e->error_code, msg, e->request_code,
e->minor_code);
return 0;
}
Gtk::GdkFilterReturn key_filter(Gtk::GdkXEvent *gdk_xevent,
Gtk::GdkEvent *event,
Gtk::gpointer data)
{
XKeyEvent *xevent = gdk_xevent;
if (xevent->type == KeyPress)
{
int key = ((XKeyEvent *)gdk_xevent)->keycode;
int keysym = XKeycodeToKeysym(Gtk::gdk_display, key, 0);
printf("caught keysym %i\n", keysym);
switch (keysym)
{
case 1: // your_keysym
// your key handler code
break;
}
}
return Gtk::GDK_FILTER_CONTINUE;
}
Gtk::GdkWindow *Root = Gtk::gdk_get_default_root_window();
KeyCode kc = XKeysymToKeycode(Gtk::gdk_display, HotKeyCode);
XSetErrorHandler(x_err_callback);
int r = XGrabKey( Gtk::gdk_display,
kc,
AnyModifier /* modifiers */,
GDK_WINDOW_XWINDOW(Root) /* grab_window */,
TRUE /* owner_events */,
GrabModeAsync /* pointer_mode */,
GrabModeSync /* keyboard_mode */);
Gtk::gdk_window_set_events(Root,
(Gtk::GdkEventMask)
(Gtk::GDK_KEY_PRESS_MASK |
Gtk::GDK_KEY_RELEASE_MASK));
Gtk::gdk_window_add_filter(NULL, key_filter, this);
最佳答案
返回值 1
并不意味着发生了 BadRequest 错误。 Xlib handles errors via an error handler ,并且该函数将始终返回 1
,如果它完全返回。
您的代码不起作用,因为您必须执行 XGrabKey
在根窗口 ( GetDefaultRootWindow(Gtk::gdk_display)
) 上。这是一个纯 Xlib 演示:
#include <X11/Xlib.h>
#include <X11/keysym.h>
#include <stdio.h>
int main() {
Display *d = XOpenDisplay(0);
Window root = DefaultRootWindow(d);
int keycode = XKeysymToKeycode(d, XK_BackSpace);
int rv = XGrabKey(d, keycode, AnyModifier, root, 1, GrabModeAsync, GrabModeAsync);
printf("XGrabKey returned %d\n", rv);
XEvent evt;
while(1) {
XNextEvent(d, &evt);
printf("Got event %d\n", evt.type);
}
}
gdk_window_add_filter
在
NULL
或在根窗口和
GdkFilterFunc
处理与您的全局热键关联的事件:
#include <X11/Xlib.h>
#include <X11/keysym.h>
#include <gtk/gtk.h>
#include <gdk/gdkx.h>
#include <stdio.h>
GdkFilterReturn filter(GdkXEvent *xevent, GdkEvent *event, gpointer data) {
XKeyEvent *ev = (XKeyEvent *)xevent;
if(ev->type == 2) {
printf("Backspace hit.\n");
}
return GDK_FILTER_CONTINUE;
}
int main(int argc, char *argv[]) {
gtk_init(&argc, &argv);
GdkScreen *scr = gdk_screen_get_default();
GdkWindow *groot = gdk_screen_get_root_window(scr);
gdk_window_set_events(groot, GDK_KEY_PRESS_MASK);
gdk_window_add_filter(groot, filter, NULL);
Display *d = gdk_x11_get_default_xdisplay();
Window root = GDK_WINDOW_XID(groot);
int keycode = XKeysymToKeycode(d, XK_BackSpace);
XGrabKey(d, keycode, AnyModifier, root, 1, GrabModeAsync, GrabModeAsync);
gtk_main();
}
0
的修饰符掩码意味着不必启用任何修饰符,即使是那些不会修改键含义的修饰符。用
0
捕获字母“A”修饰符不会匹配 NumLock + A。这就是我使用
AnyModifer
的原因.
关于gtk - 为什么 XGrabKey 返回 BadRequest?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30994628/
我需要使用 HttpClientFactory 来连接到外部 api。Startup.cs 中的代码如下所示 public void SetUpHttpClients(IServiceCollecti
我目前正在使用 Eventstore,但收到以下错误:Could not recognize BadRequest; 来自: game process tick failed UnknownError
我尝试为我设置的新 Azure 应用服务生成 Azure 应用服务托管证书。 当我运行命令生成 Azure 应用服务托管证书时: az webapp config ssl create --resou
我正在尝试进行 PATCH 操作,如果请求正文包含契约(Contract)中未指定的字段,则该操作应该会失败。例如,如果我调用此方法: [HttpPatch("{id}")] public async
调用SpeakSsmlAsync时(Microsoft Speech SDK),返回如下错误信息: > CANCELED: Reason=Error > CANCELED: ErrorCode=Bad
我想为以下代码编写单元测试用例 HomeController.cs [HttpPost] [ActionName("CreateDemo")] public async
看来HttpGet方法的返回类型不必是 ActionResult .例如,以下方法有效: [HttpGet] [Route("list")] public async Task> List() 但是,
所以我正在研究 Gtk/X11/Linux app将屏幕捕获到 .gif 并且停止捕获的方法之一是按键(Esc、Space 或 End)。您也可以使用超时。但是,要实现按键以结束捕获,我必须能够捕获键
我正在运行一个 rails 应用程序,我有一个简单的显示操作,其中的代码类似于以下内容: @post = Post.find(params[:id]) 所以如果你去帖子/1 例如,如果有帖子,您将看到
我正在尝试使用 Register-AzureRmAutomationDscNode powershell 命令在 Azure VM 上注册 DSC 配置。 Register-AzureRmAutoma
我正在创建一个仅运行简单的“等待”的管道,仅用于测试,因为我试图理解为什么我的其他管道返回错误(相同的错误)。 当我尝试调试时,它发送以下错误: { "code": "BadRequest",
我不知道怎么做,但是 Azure 允许您为同一个 VIP 在不同的 VMS 中输入两个相同的端点。现在我无法删除这些端点。有人知道我该怎么办吗? 端点 删除端点时出错 我也尝试过删除 VIP 和保留
我将 Azure Media Services v3 与 Azure Function v3 应用程序结合使用,在尝试从 https url 创建新作业时遇到问题。 我在提交作业的 Azure Fun
我想使用基于查询的 PowerShell 创建日志警报。我按照 https://learn.microsoft.com/en-us/azure/azure-monitor/platform/alert
此处使用 .net core Web api。 我的 api 中有一个端点: [HttpPost("data")] public async Task PostData(List udata) {
我正在开发一个 Spring 应用程序,目前我正在对我们的客户注册表实现搜索。 我们用户请求的一个关键点是最多可以对以下参数中的一个进行搜索:名称OR id(可以是部分)OR 店铺id(顾客注册的店铺
我将 Azure Media Services v3 与 Azure Function v3 应用程序结合使用,在尝试从 https url 创建新作业时遇到问题。 我在提交作业的 Azure Fun
我想使用基于查询的 PowerShell 创建日志警报。我按照 https://learn.microsoft.com/en-us/azure/azure-monitor/platform/alert
此处使用 .net core Web api。 我的 api 中有一个端点: [HttpPost("data")] public async Task PostData(List udata) {
我正在编写一个 x11 剪贴板客户端,但 INCR 遇到了困难。基本上,我的问题是,当我调用 XDeleteProperty 来启动 INCR 传输时,我收到了 BadRequest 错误代码 这是一
我是一名优秀的程序员,十分优秀!