我在 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
,因为那时文本字段仍然没有聚焦。
我希望你能帮助我。 非常感谢你!
答案 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);
现在正在工作!