问题5.5-Windows API无法正常工作

Qt 5.5 - Windows API not Working as usual

本文关键字:常工作 工作 5-Windows API 问题      更新时间:2023-10-16

我在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,因为这样文本字段仍然没有聚焦。

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

[已解决]

这是不可能的,因为要设置前景窗口,我必须获得当前的输入,我做了以下操作:

施工单位:

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);

现在开始工作了!