Qt 5.5 - Windows API不像往常一样工作

时间:2016-03-23 16:09:22

标签: c++ windows qt c++11 winapi

我在 Windows 10 上使用 Qt 5.5 ,我想在前景中打开QWidget并想要焦点 LineEdit,如Windows上的RUN(WIN + R)。问题是应用程序在后台运行,我只有一个键盘记录器来注册一个快捷方式(LCTRL + LWIN + T)来切换窗口(显示+焦点/隐藏)。

如果按下快捷键,我执行以下代码:

   if(this->isHidden()){

      this->show();

      //Windows API Methods:
      SetActiveWindow((HWND) this->winId());
      SetForegroundWindow((HWND) this->winId());
      SetFocus((HWND) this->winId());

      this->_edit->setFocus();

      qDebug() << "[OUT][DONT WORKING] Window shoud be shown and focused";
    }else{
      this->hide();
      qDebug() << "[OUT][WORKING] Window shoud be hidden";
    }

如果我现在按 LCTRL + LWIN + T ,它会在后台打开窗口,这不是我想要的。有人可以解释为什么这不起作用?如果窗口在前台打开并且文本框聚焦,我该怎么办?而且我不想设置标志StayAlwaysOnTop,因为那时文本字段仍然没有聚焦。

我希望你能帮助我。 非常感谢你!

1 个答案:

答案 0 :(得分:0)

[解决]

这是不可能的,因为设置ForegroundWindow我必须得到当前的输入,我做了以下:

Construcor:

HWND wId = (HWND) winId();
DWORD pId = GetWindowThreadProcessId(wId, NULL);
AllowSetForegroundWindow(pId);

onShortcutPressed:

this->show();
HWND wId = (HWND) winId();
DWORD pId = GetWindowThreadProcessId(wId, NULL);
DWORD fpId = GetWindowThreadProcessId(GetForegroundWindow(), NULL);

//Attach Thread to get the Input - i am now allowed to set the Foreground window!
AttachThreadInput(fpId, pId, true);
SetActiveWindow(wId);
SetForegroundWindow(wId);
SetFocus(wId);
AttachThreadInput(fpId, pId, false);

现在正在工作!