在QT应用程序中使用Windows 10屏幕键盘

时间:2018-05-24 12:58:18

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

我正在尝试为使用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");

}

**尝试5特意给出一个错误,详细说明找不到该文件,并建议检查是否指定了正确的路径。我已经验证了路径,并且osk.exe运行得很好 - 不是来自我的应用程序。

1 个答案:

答案 0 :(得分:3)

要显示它,只需启动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);

只有32位应用才需要Wow64...次来电,您需要与shell32.lib进行关联。