这里的QProcess是Qt的进程类,如果用别的平台可以另做处理

#include <QProcess>



#ifdef Q_OS_WIN32
#include "Windows.h"
#include <ShellAPI.h>

#endif



void windowsTabTip()
{
bool ret = false;
OSVERSIONINFO osvi;
ZeroMemory(&osvi, sizeof(OSVERSIONINFO));
osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
GetVersionEx(&osvi);
char* windir = getenv("windir");
char winroot = 'c';
if (!windir || strcmp(windir, "")) {
winroot = windir[0];
}
char tabtip[260];
char tabtipworksp[260];
if (osvi.dwMajorVersion <= 5) {// XP
sprintf(tabtip, "%c:\\Windows\\System32\\osk.exe ", winroot);
sprintf(tabtipworksp, "%c:\\Windows\\System32", winroot);
ret = QProcess::startDetached(tabtip, QStringList(), tabtipworksp);
} else if (osvi.dwMajorVersion >= 6) {
if (osvi.dwMinorVersion >= 2) { // win8, win8.1, Windows Server 2012
PVOID OldValue;
BOOL bRet = Wow64DisableWow64FsRedirection(&OldValue);
ShellExecuteA(NULL, "open", "osk.exe", 0, 0, SW_SHOW);
if (bRet) {
Wow64RevertWow64FsRedirection(OldValue);
}
return ;
}
// vista win7
sprintf(tabtip, "%c:\\Program Files\\Common Files\\Microsoft Shared\\ink\\TabTip.exe ", winroot);
sprintf(tabtipworksp, "%c:\\Program Files\\Common Files\\Microsoft Shared\\ink", winroot);
ret = QProcess::startDetached(tabtip, QStringList(), tabtipworksp);
if (!ret) {
sprintf(tabtip, "%c:\\Program Files (x86)\\Common Files\\Microsoft Shared\\ink\\TabTip32.exe ", winroot);
sprintf(tabtipworksp, "%c:\\Program Files (x86)\\Common Files\\Microsoft Shared\\ink", winroot);
ret = QProcess::startDetached(tabtip, QStringList(), tabtipworksp);
if (!ret) {
HWND hTabTip = ::FindWindowA("IPTip_Main_Window", 0);
if (hTabTip) {
ShowWindow(hTabTip, SW_NORMAL);
DWORD WM_DESKBAND_CLICKED = ::RegisterWindowMessage(L"TabletInputPanelDeskBandClicked");
::PostMessage(hTabTip, WM_DESKBAND_CLICKED, 0, 0);
} else {
sprintf(tabtip, "%c:\\Windows\\System32\\osk.exe ", winroot);
sprintf(tabtipworksp, "%c:\\Windows\\System32", winroot);
ret = QProcess::startDetached(tabtip, QStringList(), tabtipworksp);
}
}
}
}
}