【问题标题】:Using Windows 10 on-screen keyboard in QT app在 QT 应用程序中使用 Windows 10 屏幕键盘
【发布时间】:2018-11-03 17:24:42
【问题描述】:

我正在尝试为使用 QT/C++ 开发的应用程序调出 Windows 屏幕键盘。我目前有一个自定义屏幕键盘,但在所有屏幕尺寸下看起来都不是很好,所以我想使用 Windows 原生键盘。当输入焦点在文本框上时,我想自动调出键盘。我是 QT 的新手,但不是 C++ 的新手。我检查了其他一些类似的问题,但似乎这些解决方案没有太大帮助。

编辑:以下解决方案不会启动键盘。它们编译时没有错误,但实际上并没有启动 osk。

void MainWindow::on_Button_released()
{
    ui->Button->setChecked(true);

    //Attempt 1
    //ShellExecute( NULL, NULL, L"osk.exe", NULL, NULL, SW_SHOW );

    //Attempt 2
    /* QObject *parent;
         QString program = "./osk.exe";
         QStringList arguments;
         //arguments << "-b" << "-t" << "input.txt";

         QProcess *myProcess = new QProcess(parent);
         myProcess->start(program);//, arguments);
    */

    //Attempt 3
    /* QProcess *process = new QProcess(this);
    QString file = QDir::homepath + "/tabtip.exe";
    process->start(file);
    */

    //Attempt 4
    /* 
    QProcess::execute ("start C:\\Windows\\System32\\osk.exe");
    */


    //Attempt 5
    system ("start C:\\Windows\\System32\\osk.exe");

}

**Attempt 5 特别给出了一个错误,详细说明找不到文件,并建议检查是否指定了正确的路径。我已经验证了路径,并且 osk.exe 运行良好 - 只是不在我的应用程序中。

【问题讨论】:

  • 我真的很惊讶这个问题被搁置了。除了需要一些小的澄清之外,这对我来说似乎很好。
  • 我并不感到惊讶...这里的许多人倾向于尽可能地摆脱问题而不是回答问题。出于这个原因,我只将这个网站作为最后的手段。
  • 编辑您的问题(只需简单的编辑即可)。这将引起有权重新打开它的人的注意。我的编辑(由第三方)没有这种效果。顺便说一句,我投了赞成票。我敢肯定你不是唯一一个想要这样做的人。
  • 修复了您在启动 osk 时遇到的问题 - 见下文。

标签: c++ windows qt user-interface keyboard


【解决方案1】:

要显示它,只需启动 osk.exe

摆脱它 (*)(警告 - 未记录的行为):

HANDLE hWnd = FindWindowW (L"OSKMainClass", NULL);
if (hWnd)
{
     PostMessage (hWnd, WM_SYSCOMMAND, SC_CLOSE);
  // Or if you prefer:
  // PostMessage (hWnd, WM_SYSCOMMAND, SC_MINIMIZE, 0);
}

我知道这适用于 Windows 10,并且可能可以追溯到 Windows 7。

(*) 我很感谢 @zett42 提供这些信息(但我正在声明功劳:)


编辑: 我注意到启动OSK 需要一点技巧。你可以这样做:

#include <shellapi.h>

void *was;
Wow64DisableWow64FsRedirection (&was);
ShellExecuteA (NULL, "open", "osk.exe", NULL, NULL, SW_SHOWNORMAL);
Wow64RevertWow64FsRedirection (was);

Wow64... 调用仅在 32 位应用程序中需要,您需要与 shell32.lib 链接。

【讨论】:

    猜你喜欢
    • 2016-02-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-01
    • 2015-11-11
    • 2018-12-18
    • 2010-11-13
    • 1970-01-01
    相关资源
    最近更新 更多