Использование экранной клавиатуры Windows 10 в приложении QT

1

Я пытаюсь открыть экранную клавиатуру Windows для приложения, разработанного с QT/C++. В настоящее время у меня есть пользовательская экранная клавиатура, но она не выглядит очень красивой на всех размерах экрана, поэтому я хочу использовать родной 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 работает отлично -just не из моего приложения.

  • 0
    Я действительно очень удивлен, что этот вопрос был отложен. Помимо небольшого уточнения мне кажется, что это нормально.
  • 1
    Я не настолько удивлен ... многие здесь стараются изо всех сил стараться избавиться от вопросов, а не отвечать на них. Я использую этот сайт только в качестве последнего средства по этой самой причине.
Показать ещё 2 комментария
Теги:
user-interface
qt
keyboard

1 ответ

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.

  • 0
    Это сработало отлично. Спасибо!

Ещё вопросы

Сообщество Overcoder
Наверх
Меню