Я пытаюсь открыть экранную клавиатуру 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 не из моего приложения.
Чтобы отобразить его, просто запустите 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
.