亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

c++調(diào)用windows鍵盤代碼詳情

 更新時間:2021年09月24日 17:20:01   作者:頭微涼  
c++調(diào)用windows鍵盤有好幾種方式,本文就根據(jù)列舉的例子對c++調(diào)用windows鍵盤詳細介紹并附上代碼說明,需要的朋友可以參考下面文章的具體內(nèi)容

1、何為windows鍵盤

 windows管這個長得有點兒丑的叫屏幕鍵盤

windows管這個長得好看的叫觸摸鍵盤

當然上面的截圖是win10的鍵盤效果,在win7上是有一些差別的,這里就不截圖放出來了

2、如何調(diào)用這些windows鍵盤

似乎很簡單,我們用Spy++抓下窗口,找到窗口句柄所關(guān)聯(lián)的進程句柄,再查看下是哪個進程以及命令行信息,然后我們就可以愉快地執(zhí)行命令調(diào)用進程了
屏幕鍵盤進程信息:

 觸摸鍵盤進程信息:

 命令行走起,運行exe,此時如果兩個鍵盤你都能順利調(diào)起的話,我只能告訴你,你被你的系統(tǒng)蒙蔽了雙眼

3、巨(wei)硬(ruan)搞事情

當系統(tǒng)版本大于等于win10 10.0.14393.0時,觸摸鍵盤你調(diào)用TabTip.exe并不會顯示出來,也就是說它的內(nèi)部實現(xiàn)方式變了。
到這里你會不會覺得很詫異,這不是標準玩法嗎?為什么毫無預(yù)兆就不行了呢?
我只能說你太傻太天真,微軟官網(wǎng)本身就沒有說明鍵盤調(diào)用的正確姿勢,也就是說觸摸鍵盤對微軟來說并非開放給你的。當然互聯(lián)網(wǎng)無所不能,有大神還是想方法逆向了觸摸鍵盤調(diào)用的方式

4、具體代碼

// 4ce576fa-83dc-4F88-951c-9d0782b4e376
DEFINE_GUID(CLSID_UIHostNoLaunch,
    0x4CE576FA, 0x83DC, 0x4f88, 0x95, 0x1C, 0x9D, 0x07, 0x82, 0xB4, 0xE3, 0x76);

// 37c994e7_432b_4834_a2f7_dce1f13b834b
DEFINE_GUID(IID_ITipInvocation,
    0x37c994e7, 0x432b, 0x4834, 0xa2, 0xf7, 0xdc, 0xe1, 0xf1, 0x3b, 0x83, 0x4b);

struct ITipInvocation : IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE Toggle(HWND wnd) = 0;
};

namespace
{
constexpr auto kKeyboardWindowClass = L"IPTip_Main_Window";
constexpr auto kWindowParentClass = L"ApplicationFrameWindow";
constexpr auto kWindowClass = L"Windows.UI.Core.CoreWindow";
constexpr auto kWindowCaption = L"Microsoft Text Input Application";
constexpr auto kTabTipPath = L"C:\\Program Files\\Common Files\\Microsoft Shared\\ink\\TabTip.exe";
constexpr auto kTabletTipSubKey = "Software\\Microsoft\\TabletTip";
constexpr auto kTabletTipOption = "EnableDesktopModeAutoInvoke";
}

調(diào)用屏幕鍵盤

bool ScreenKeyBoard::OpenOskKeyboard()
{
    if (!PublicUtils::Process::FindProcess("osk.exe").empty())
    {
        return true;
    }
    PVOID OldValue = NULL;
    //64位系統(tǒng)中32位程序要訪問本機system32文件夾,需取消重定向到Syswow64
    BOOL bRet = Wow64DisableWow64FsRedirection(&OldValue);
    ShellExecuteW(NULL, L"open", L"osk.exe", NULL, NULL, SW_SHOWNORMAL);
    if (bRet)
    {
        Wow64RevertWow64FsRedirection(OldValue);
        return true;
    }
    else
    {
        std::cerr << "Wow64DisableWow64FsRedirection fail err code:" << GetLastError() << std::endl;
        return false;
    }
}

調(diào)用觸摸鍵盤

bool ScreenKeyBoard::OpenTabTipByProcess(const std::wstring& tabTipPath)
{
    //將進程TabTip.exe拉起,如果是進程存在的情況下,再次調(diào)用會直接顯示鍵盤界面
    if (!ShellExecuteW(NULL, L"open", tabTipPath.c_str(), NULL, NULL, SW_SHOWNORMAL))
    {
        std::cerr << "ShellExecuteW tabTip err:" << GetLastError() << std::endl;
        return false;
    }
    std::cout << "ShellExecuteW tabTip success";
    return true;
}

調(diào)用觸摸鍵盤

COM調(diào)用方式,不知道COM的需要自己惡補下知識,和windows打交道還是很香的,但坑也多

bool ScreenKeyBoard::OpenTabTipByProcess(const std::wstring& tabTipPath)
{
    //將進程TabTip.exe拉起,如果是進程存在的情況下,再次調(diào)用會直接顯示鍵盤界面
    if (!ShellExecuteW(NULL, L"open", tabTipPath.c_str(), NULL, NULL, SW_SHOWNORMAL))
    {
        std::cerr << "ShellExecuteW tabTip err:" << GetLastError() << std::endl;
        return false;
    }
    std::cout << "ShellExecuteW tabTip success";
    return true;
}

根據(jù)系統(tǒng)版本選擇調(diào)用觸摸鍵盤的方式

bool ScreenKeyBoard::OpenScreenKeyboard()
{
    if (!IsTabTipAutoInvokeOnDesktopMode())
    {
        return OpenTabTip();
    }

 
    //觸摸鍵盤有一設(shè)置項:不處于平板電腦模式且未連接鍵盤時顯示觸摸鍵盤,增加延遲避開系統(tǒng)調(diào)用鍵盤
    std::thread([]() {
        PublicUtils::Sleep(std::chrono::milliseconds(500));
        OpenTabTip();
    }).detach();
    return true;
}

bool ScreenKeyBoard::OpenTabTip()
{
    auto version = PublicUtils::Environment::OsVersion();
    std::cout << "os version:" << version.ToString() << std::endl;
    if (IsNewTabTipKeyboardVisable() || IsOldTabTipKeyboardVisable())
    {
        std::cout << "keyboard is visible" << std::endl;
        return true;
    }
    //系統(tǒng)版本大于等于win10 10.0.14393.0,需要使用com組件的接口才能將鍵盤界面顯示出來
    if (10 == version.GetMajor() && version.GetPatch() >= 14393)
    {
        return OpenTabTipByCom(kTabTipPath);
    }
    else
    {
        return OpenTabTipByProcess(kTabTipPath);
    }
}

在調(diào)用觸摸鍵盤前有一個代碼片段用來判斷觸摸鍵盤是否處于顯示狀態(tài),這是為什么呢?
因為觸摸鍵盤TabTip沒有明確的接口區(qū)分顯示和隱藏,當調(diào)用時會根據(jù)當前的狀態(tài)決定下一個狀態(tài),即隱藏時調(diào)用會顯示,顯示時調(diào)用會隱藏,所以就需要我們自己判斷鍵盤狀態(tài)

  • 判斷鍵盤狀態(tài),Spy++抓觸摸鍵盤窗口,自己分析一些特性
  • 需要注意觸摸鍵盤這個設(shè)置項的作用,在代碼中需要做處理(這個設(shè)置開啟后系統(tǒng)會檢測到有輸入框聚焦時自動調(diào)起觸摸鍵盤,如果你在代碼中去調(diào)用的話,可能會存在一些沖突)

![image.png](https://p1-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/233c5a6ce0804795be5ed48a207fbeb2~tplv-k3u1fbpfcp-watermark.image)
bool ScreenKeyBoard::IsNewTabTipKeyboardVisable()
{
    //win10下父窗口是ApplicationFrameWindow子窗口是Windows.UI.Core.CoreWindow
    HWND parent = FindWindowExW(NULL, NULL, kWindowParentClass, NULL);
    if (!parent)
    {
        std::cerr << "no more windows, keyboard state is unknown. class:" << PublicUtils::CharsetUtils::UnicodeToUTF8(kWindowParentClass) << std::endl;
        return false;
    }

    HWND wnd = FindWindowExW(parent, NULL, kWindowClass, kWindowCaption);
    if (!wnd)
    {
        std::cerr << "it's a child of a WindowParentClass1709 window - the keyboard is open. class:" << PublicUtils::CharsetUtils::UnicodeToUTF8(kWindowClass)
            << " caption" << PublicUtils::CharsetUtils::UnicodeToUTF8(kWindowCaption) << std::endl;
        return false;
    }

    //觸摸鍵盤顯示和隱藏不能用IsWindowVisible判斷,判斷方式可參考 https://stackoverflow.com/questions/32149880/how-to-identify-windows-10-background-store-processes-that-have-non-displayed-wi
    int cloaked = 0;
    if (DwmGetWindowAttribute(wnd, DWMWA_CLOAKED, &cloaked, DWM_CLOAKED_INHERITED) != S_OK)
    {
        std::cerr << "DwmGetWindowAttribute err:" << GetLastError() << std::endl;
        return false;
    }
    std::cout << "DwmGetWindowAttribute cloaked=" << cloaked;
    return 0 == cloaked;
}

bool ScreenKeyBoard::IsOldTabTipKeyboardVisable()
{
    HWND touchhWnd = FindWindowW(kKeyboardWindowClass, NULL);
    if (!touchhWnd)
    {
        std::cerr << "without window:" << PublicUtils::CharsetUtils::UnicodeToUTF8(kKeyboardWindowClass) << std::endl;
        return false;
    }

    unsigned long style = GetWindowLong(touchhWnd, GWL_STYLE);
    // 由于有的系統(tǒng)在鍵盤不顯示時候只是多返回一個WS_DISABLED這個字段。所以加一個它的判斷
    std::cout << "WS_CLIPSIBLINGS:" << (style & WS_CLIPSIBLINGS)
        << " WS_VISIBLE:" << (style & WS_VISIBLE)
        << " WS_POPUP:" << (style & WS_POPUP)
        << " WS_DISABLED:" << !(style & WS_DISABLED) << std::endl;
    return (style & WS_CLIPSIBLINGS) && (style & WS_VISIBLE) && (style & WS_POPUP) && !(style & WS_DISABLED);
}

 

到此這篇關(guān)于c++調(diào)用windows鍵盤代碼詳情的文章就介紹到這了,更多相關(guān)c++調(diào)用windows鍵盤內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C語言實現(xiàn)BMP圖像邊緣檢測處理

    C語言實現(xiàn)BMP圖像邊緣檢測處理

    這篇文章主要為大家詳細介紹了C語言實現(xiàn)BMP圖像邊緣檢測處理,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-10-10
  • C++多態(tài)的全面講解

    C++多態(tài)的全面講解

    多態(tài)按字面的意思就是多種形態(tài)。當類之間存在層次結(jié)構(gòu),并且類之間是通過繼承關(guān)聯(lián)時,就會用到多態(tài)。C++?多態(tài)意味著調(diào)用成員函數(shù)時,會根據(jù)調(diào)用函數(shù)的對象的類型來執(zhí)行不同的函數(shù)
    2022-06-06
  • 解讀C++編程中類模板的三種特化

    解讀C++編程中類模板的三種特化

    這篇文章主要介紹了C++編程中類模板的三種特化,需要的朋友可以參考下
    2016-01-01
  • C++實現(xiàn)并優(yōu)化異常系統(tǒng)

    C++實現(xiàn)并優(yōu)化異常系統(tǒng)

    異常處理是C++的一項語言機制,用于在程序中處理異常事件,下面這篇文章主要給大家介紹了關(guān)于C++中異常的相關(guān)資料,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下
    2022-08-08
  • C語言實現(xiàn)JSON解析器的方法步驟

    C語言實現(xiàn)JSON解析器的方法步驟

    JSON是一種非常流行的數(shù)據(jù)格式,本文主要介紹了C語言實現(xiàn)JSON解析器的方法步驟,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2024-08-08
  • C++中拷貝構(gòu)造函數(shù)的總結(jié)詳解

    C++中拷貝構(gòu)造函數(shù)的總結(jié)詳解

    深拷貝和淺拷貝可以簡單理解為:如果一個類擁有資源,當這個類的對象發(fā)生復(fù)制過程的時候,資源重新分配,這個過程就是深拷貝,反之,沒有重新分配資源,就是淺拷貝
    2013-09-09
  • C語言詳解數(shù)據(jù)結(jié)構(gòu)與算法中枚舉和模擬及排序

    C語言詳解數(shù)據(jù)結(jié)構(gòu)與算法中枚舉和模擬及排序

    枚舉和模擬其實是沒什么算法可言的,大多數(shù)都是按照題目意思去寫,這里提供快排和歸并的兩個模板,感興趣的朋友來看看吧
    2022-04-04
  • 淺析C++模板類型中的原樣轉(zhuǎn)發(fā)和可變參數(shù)的實現(xiàn)

    淺析C++模板類型中的原樣轉(zhuǎn)發(fā)和可變參數(shù)的實現(xiàn)

    可變參數(shù)模板(variadic templates)是C++11新增的強大的特性之一,它對模板參數(shù)進行了高度泛化,能表示0到任意個數(shù)、任意類型的參數(shù),這篇文章主要介紹了C++可變參數(shù)模板的展開方式,需要的朋友可以參考下
    2022-08-08
  • C語言課程設(shè)計之抽獎系統(tǒng)

    C語言課程設(shè)計之抽獎系統(tǒng)

    這篇文章主要為大家詳細介紹了C語言課程設(shè)計之抽獎系統(tǒng),文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-12-12
  • C++中聲明、定義、初始化、賦值區(qū)別介紹

    C++中聲明、定義、初始化、賦值區(qū)別介紹

    在?C++?中,聲明、定義、初始化、賦值是變量的四個基本操作,很多朋友不清楚他們之間有什么區(qū)別,今天通過本文給大家介紹下C++中聲明、定義、初始化、賦值區(qū)別,感興趣的朋友一起看看吧
    2023-05-05

最新評論