Linux,execl(),为什么我丢失应用程序的键盘输入?

标签 linux qt keyboard exec

我的 Linux 程序的名称类似于 MyProgram_0001,并且较新的版本编号较大。启动时,该应用程序会在同一目录中寻找较新的版本,如果找到则通过 execl() 调用它。这很好用,但是当鼠标继续工作时,新版本不会获得任何键盘输入,即使我事先单击它的窗口也是如此。调用应用程序消失了,其他正在运行的程序继续获得键盘输入......有什么想法吗?实际上该程序是用 C++ Qt Designer 4.7 应用程序编写的,但这不应该很重要,或者也许它很重要:-)?

好的,更多信息......这是捕获 key 并调用我的 SLOT 的代码......

// define my own event handler
// capture all key presses ...
bool Layout10::eventFilter(QObject *obj, QEvent *event)
{
    if (event->type() == QEvent::KeyPress)
    {
        QKeyEvent *keyEvent = static_cast<QKeyEvent*>(event);

        // directly exit on Alt-keys
        if (keyEvent->modifiers()&Qt::AltModifier) return true;

        // normal keyboard
        if ((!(keyEvent->modifiers()&Qt::KeypadModifier))&&(Keyboard_On)) switch (keyEvent->key())
        {
            case Qt::Key_0:         C->Num0ButtonClicked_KP(); return true;
            case Qt::Key_1:         C->Num1ButtonClicked_KP(); return true;
            case Qt::Key_2:         C->Num2ButtonClicked_KP(); return true;
            case Qt::Key_3:         C->Num3ButtonClicked_KP(); return true;
            case Qt::Key_4:         C->Num4ButtonClicked_KP(); return true;
            case Qt::Key_5:         C->Num5ButtonClicked_KP(); return true;
            case Qt::Key_6:         C->Num6ButtonClicked_KP(); return true;
            case Qt::Key_7:         C->Num7ButtonClicked_KP(); return true;
            case Qt::Key_8:         C->Num8ButtonClicked_KP(); return true;
            case Qt::Key_9:         C->Num9ButtonClicked_KP(); return true;
            case Qt::Key_X:         C->XButtonClicked_KP();    return true;
            case Qt::Key_Backspace: C->EButtonClicked_KP();    return true;
            case Qt::Key_F1:        C->F1ButtonClicked_KP();   return true;
            case Qt::Key_F2:        C->F2ButtonClicked_KP();   return true;
            case Qt::Key_F3:        C->F3ButtonClicked_KP();   return true;
        }

        // keypad
        if ((keyEvent->modifiers()&Qt::KeypadModifier)&&(Keypad_On)) switch (keyEvent->key())
        {
            case Qt::Key_0:         C->Num0ButtonClicked_KP(); return true;
            case Qt::Key_Insert:    C->Num0ButtonClicked_KP(); return true;
            case Qt::Key_1:         C->Num1ButtonClicked_KP(); return true;
            case Qt::Key_End:       C->Num1ButtonClicked_KP(); return true;
            case Qt::Key_2:         C->Num2ButtonClicked_KP(); return true;
            case Qt::Key_Down:      C->Num2ButtonClicked_KP(); return true;
            case Qt::Key_3:         C->Num3ButtonClicked_KP(); return true;
            case Qt::Key_PageDown:  C->Num3ButtonClicked_KP(); return true;
            case Qt::Key_4:         C->Num4ButtonClicked_KP(); return true;
            case Qt::Key_Left:      C->Num4ButtonClicked_KP(); return true;
            case Qt::Key_5:         C->Num5ButtonClicked_KP(); return true;
            case Qt::Key_Clear:     C->Num5ButtonClicked_KP(); return true;
            case Qt::Key_6:         C->Num6ButtonClicked_KP(); return true;
            case Qt::Key_Right:     C->Num6ButtonClicked_KP(); return true;
            case Qt::Key_7:         C->Num7ButtonClicked_KP(); return true;
            case Qt::Key_Home:      C->Num7ButtonClicked_KP(); return true;
            case Qt::Key_8:         C->Num8ButtonClicked_KP(); return true;
            case Qt::Key_Up:        C->Num8ButtonClicked_KP(); return true;
            case Qt::Key_9:         C->Num9ButtonClicked_KP(); return true;
            case Qt::Key_PageUp:    C->Num9ButtonClicked_KP(); return true;
            case Qt::Key_Back:      C->XButtonClicked_KP();    return true; // maybe it should have been backslash ?
            case Qt::Key_Delete:    C->EButtonClicked_KP();    return true;
            case Qt::Key_division:  C->F1ButtonClicked_KP();   return true;
            case Qt::Key_multiply:  C->F2ButtonClicked_KP();   return true;
            case Qt::Key_Minus:     C->F3ButtonClicked_KP();   return true;
        }
        return true; // event is NOT given over for further processing
    }
    else
    {
        return false; // other events may be processed further
    }
}

Keyboard_On 只是该类的一个公共(public) bool 值成员,如果向用户显示触摸屏,我用它来禁用键盘。上面的消息处理程序是这样安装的...

this->installEventFilter(this);

... 在小部件类的构造函数中...我有一个这样的处理程序,用于构成我的对话框的所有小部件类...好吧,除非我通过 execl 或 startDetached() 从自身启动应用程序,否则它会起作用。 ..

startDetached() 的描述中有一件事引起了我的注意......他们写道,新进程在其自己的环境中运行,并且在 Linux 下表现得像守护进程。我想知道这是否是我丢失 key 的原因......

这真的让我很困惑。是否有击键必须通过的一些层链以及我可以调试它并查看我在什么级别松动它们的方法?谢谢!

更多信息 ... 我发现如果我通过 execl 调用完全相同的二进制文件,我不会松开键盘。如果我将该二进制文件复制到不同的名称并调用它......键盘消失了。它归结为 execl 调用中的单个字母更改,仅在第二个参数中,所有其他相同的错误仍然发生......似乎如果路径+二进制文件相同,则某些上下文保持不变,但是否则 key 将被发送到旧上下文,并且通过 execl 调用的文件将在不同的上下文中启动 ...

最佳答案

许多应用程序通过运行二进制文件的 shell 脚本而不是二进制文件本身来处理此类问题。 Firefox 就是这样做的。您可以在脚本中执行“最新版本”检查。

关于Linux,execl(),为什么我丢失应用程序的键盘输入?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5964140/

相关文章:

linux - 用刚刚编译的新版本替换旧版本的 libgmp

linux - 从文件中读取用户名和密码

linux - 如何组合两个不同的linux命令?

javascript - Phonegap Android 在输入焦点 Javascript 上显示键盘

android - AutoCompleteTextView:在后按时删除软键盘而不是建议

javascript - jQuery - 如何在坐标系统中移动图形

node.js - 如何在服务器重启时运行 Node js

c++ - 在 Qt 中单击 QTableView 中某一行的特定单元格时打开一个新窗口

qt - 在 Ubuntu 12.04 上将 CUDA 与 Qt 集成

c++ - dhclient 实时输出到 QlistWidget