用微软接口调系统的虚拟键盘

这里的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);
                }
            }
        }
    }
}

 

发布了260 篇原创文章 · 获赞 708 · 访问量 210万+
展开阅读全文

关于注册表操作的问题

04-18

if (ERROR_SUCCESS != (ret = RegCreateKeyEx(HKEY_LOCAL_MACHINE, "SYSTEM\\CurrentControlSet\\Control", NULL, NULL, NULL, KEY_ALL_ACCESS, NULL, &hKEY, NULL))) { sprintf(errInf, "打开或创建 [HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentControlSet\\Control] 失败! ret = %ld", ret); #if 0 if (_OS_WIN7 == g_OsVer) strcat(errInf, "\nWindows 7 用户请以管理员权限运行。"); else if (_OS_WIN8 == g_OsVer) strcat(errInf, "\nWindows 8 用户请以管理员权限运行。"); else if (_OS_WIN10 == g_OsVer) strcat(errInf, "\nWindows 10 用户请以管理员权限运行。"); else if (_OS_WINTP == g_OsVer) strcat(errInf, "\nWindows 技术预览版 用户请以管理员权限运行。"); #endif return FALSE; } ::RegCloseKey(hKEY); if (ERROR_SUCCESS != (ret = RegCreateKeyEx(HKEY_LOCAL_MACHINE, "SYSTEM\\CurrentControlSet\\Control\\usbflags", NULL, NULL, NULL, KEY_ALL_ACCESS, NULL, &hKEY, NULL))) { sprintf(errInf, "打开或创建 [HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentControlSet\\Control\\usbflags] 失败! ret = %ld", ret); return FALSE; } ::RegCloseKey(hKEY); LPCTSTR StrKey = "SYSTEM\\CurrentControlSet\\Control\\usbflags"; ret = ::RegOpenKeyEx(HKEY_LOCAL_MACHINE, StrKey, NULL, KEY_READ|KEY_WRITE, &hKEY); if (ERROR_SUCCESS != ret) { sprintf(errInf, "打开 [HKEY_LOCAL_MACHINE\\%s] 失败! ret = %ld", StrKey, ret); return FALSE; } 问题: (1)逐句解读功能和实现方法; (2)前两段RegCloseKey具体作用是什么?为什么要释放你? 谢谢 问答

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 代码科技 设计师: Amelia_0503

分享到微信朋友圈

×

扫一扫,手机浏览