小编Hec*_*kel的帖子

使用XGrabKey或XGrabKeyboard重定向键盘输入

目标

我想根据键将键盘输入重定向到不同的窗口.并非所有的密钥都会被重定向到同一个窗口,我无法使用XSetInputFocus.


第一次尝试:XGrabKey

我发现我可以抓住某些键,然后将事件发送到右侧窗口.我像这样使用XGrabKey

XGrabKey( mDisplay(), 
                    XKeysymToKeycode(mDisplay(),XK_F1) , 
                    AnyModifier ,
                    RootWindow(mDisplay(), mScreenNum),
                    false, //Events aren't sent to the focused window
                    GrabModeAsync, 
                    GrabModeAsync );
Run Code Online (Sandbox Code Playgroud)

它不适用于F1到F4键,但适用于F5和F6.它也不适用于某些常规键,如e,r和t.可能还有其他人.我需要能够重定向Fkeys,所以这个解决方案对我不起作用.


第二次尝试:XGrabKeyboard

我尝试使用XGrabKeyboard,就像这样

XGrabKeyboard(mDisplay(), 
                        RootWindow(mDisplay(), mScreenNum),
                        false, 
                        GrabModeAsync, 
                        GrabModeAsync, 
                        CurrentTime);
Run Code Online (Sandbox Code Playgroud)

它适用于所有Fkeys,但它产生了其他问题.当抓取键盘处于活动状态时,我无法再使用鼠标移动窗口(如果应用程序移动窗口,它仍可正常工作),我无法访问上下文菜单和闪烁的"|" 在键入区域中不显示.

其他信息

这个问题已经在那里讨论过,但他们没有找到解决方案.我使用的是Lubuntu(LXDE)而不是GNOME,我仍然遇到同样的问题.

unmap事件可能会给出一些信息:

  • 没有抓住键盘时我点击右键

    显示上下文菜单,没有unmap事件.

  • 当我退出上下文菜单时:

    我有3个unmap事件:(我打印Unmap旁边的窗口名称)

Unmap pcmanfm  
Unmap pcmanfm 
Unmap
Run Code Online (Sandbox Code Playgroud)
  • 抓住键盘后我右键单击

    我只有一个unmap事件:

Unmap
Run Code Online (Sandbox Code Playgroud)

看起来上下文菜单在显示之前未映射.


我要的是什么

我想无论是:

  • 使用XGrabKeyboard没有副作用
  • 将XGrabKey与任何键一起使用
  • 使用另一个允许我重定向键盘输入的功能

谢谢.

c++ keyboard xlib

7
推荐指数
1
解决办法
1619
查看次数

使用Code :: Blocks GNU编译器编译多线程代码

错误

我试图使用std :: thread,但是当我尝试运行它时我有这个错误.

抛出'std :: system_error'的实例后终止调用

what():启用多线程以使用std :: thread:不允许操作

中止(核心倾倒)

我的研究结果

关于它有很多问题,每个答案都说类似的东西:我必须用"-pthread"或"-lpthread"构建.有些人还说要添加"-Wl, - no-as-needed".

链接 链接 链接 链接 链接 链接 链接

我尝试了很多东西,但都没有用.

细节

我正在使用Lubuntu上的Code :: Blocks 12.11,GNU GCC Compiler进行编译.在编译器设置菜单中,我检查了编译器标志

"让g ++遵循C++ 11 ISO C++语言标准[-std = c ++ 11]"

在其他选项中,我写了答案所说的,这是一个例子

-pthread
-Wl,--no-as-needed
Run Code Online (Sandbox Code Playgroud)

这是我的构建日志(我不确定它是否重要)

g++ -Wall -fexceptions  -std=c++11 -g -pthread -Wl,--no-as-needed  -std=c++11   -I../DeskManagerDll -I/usr/include/X11/extensions -I/usr/include/X11  -c /home/julien/Documents/test/main.cpp -o obj/Debug/main.o
g++ -L/home/julien/Documents/DeskManagerDll -L-L/usr/lib/i386-linux-gnu  -o bin/Debug/test obj/Debug/main.o   -L/usr/X11R6/lib  -lX11 -lXext -lpthread -Wl,--no-as-needed  /home/julien/Documents/DeskManagerDll/bin/Debug/libDeskManagerDll.so 
Output size …
Run Code Online (Sandbox Code Playgroud)

c++ linux multithreading compilation c++11

6
推荐指数
1
解决办法
5966
查看次数

每次调用方法时,自定义类将变量重置为原始值

在我的课堂上,我有两个方法负责获取和设置私有变量的值.在另一个类之外的方法中,我调用setter方法并将变量更改为另一个值.它暂时有效,但始终重置为原始值.

class storeItem
{
    public:
        void setPrice(int p)
        {
            price = p;
        }
        int getPrice()
        {
            return price;
        }
        storeItem(int p)
        {
            price = p;
        }
    private:
        int price;
}

void changePrice(storeItem item)
{
    int origPrice = item.getPrice();
    item.setPrice(rand() % 10 + 1);
    //The price is correctly changed and printed here.
    cout << "This item costs " << item.getPrice() << " dollars and the price was originally " << origPrice << " dollars." << endl;
}

int main()
{
    storeItem …
Run Code Online (Sandbox Code Playgroud)

c++

2
推荐指数
1
解决办法
730
查看次数

strtol有什么问题?

我有这个代码,它应该运行正常,但由于某种原因,循环将循环通过我在循环的条件检查之前释放字符串.从循环中退出的唯一方法是给出超过3位的整数(输入> 99 || input <-99).我正在使用gcc编译此代码,代码:: blocks作为IDE.

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

char* createString(void);

int main() {

  int temp = 0;
  char* string = 0;
  char* error = 0;

  do {
    printf("\n  Integer: ");
    string = createString();
    temp = strtol(string, &error, 10);
    if (*error != '\n' && *error != '\0') printf("\n  Input is not an integer");
    free(string);
    string = 0;
  } while (*error != '\n' && *error != '\0');
  free(error);
  error = 0;
  return 0;
}

char* createString() {

  char* …
Run Code Online (Sandbox Code Playgroud)

c

-1
推荐指数
2
解决办法
1117
查看次数

标签 统计

c++ ×3

c ×1

c++11 ×1

compilation ×1

keyboard ×1

linux ×1

multithreading ×1

xlib ×1