我想根据键将键盘输入重定向到不同的窗口.并非所有的密钥都会被重定向到同一个窗口,我无法使用XSetInputFocus.
我发现我可以抓住某些键,然后将事件发送到右侧窗口.我像这样使用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(mDisplay(),
RootWindow(mDisplay(), mScreenNum),
false,
GrabModeAsync,
GrabModeAsync,
CurrentTime);
Run Code Online (Sandbox Code Playgroud)
它适用于所有Fkeys,但它产生了其他问题.当抓取键盘处于活动状态时,我无法再使用鼠标移动窗口(如果应用程序移动窗口,它仍可正常工作),我无法访问上下文菜单和闪烁的"|" 在键入区域中不显示.
这个问题已经在那里讨论过,但他们没有找到解决方案.我使用的是Lubuntu(LXDE)而不是GNOME,我仍然遇到同样的问题.
当没有抓住键盘时我点击右键
显示上下文菜单,没有unmap事件.
当我退出上下文菜单时:
我有3个unmap事件:(我打印Unmap旁边的窗口名称)
Unmap pcmanfm
Unmap pcmanfm
Unmap
Run Code Online (Sandbox Code Playgroud)
抓住键盘后我右键单击
我只有一个unmap事件:
Unmap
Run Code Online (Sandbox Code Playgroud)
看起来上下文菜单在显示之前未映射.
我想无论是:
谢谢.
我试图使用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) 在我的课堂上,我有两个方法负责获取和设置私有变量的值.在另一个类之外的方法中,我调用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) 我有这个代码,它应该运行正常,但由于某种原因,循环将循环通过我在循环的条件检查之前释放字符串.从循环中退出的唯一方法是给出超过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)