最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

1、何為windows鍵盤(pán)

 windows管這個(gè)長(zhǎng)得有點(diǎn)兒丑的叫屏幕鍵盤(pán)

windows管這個(gè)長(zhǎng)得好看的叫觸摸鍵盤(pán)

當(dāng)然上面的截圖是win10的鍵盤(pán)效果,在win7上是有一些差別的,這里就不截圖放出來(lái)了

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

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

 觸摸鍵盤(pán)進(jìn)程信息:

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

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

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

bool ScreenKeyBoard::OpenOskKeyboard()
{
    if (!PublicUtils::Process::FindProcess("osk.exe").empty())
    {
        return true;
    }
    PVOID OldValue = NULL;
    //64位系統(tǒng)中32位程序要訪問(wèn)本機(jī)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)用觸摸鍵盤(pán)

bool ScreenKeyBoard::OpenTabTipByProcess(const std::wstring& tabTipPath)
{
    //將進(jìn)程TabTip.exe拉起,如果是進(jìn)程存在的情況下,再次調(diào)用會(huì)直接顯示鍵盤(pán)界面
    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)用觸摸鍵盤(pán)

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

bool ScreenKeyBoard::OpenTabTipByProcess(const std::wstring& tabTipPath)
{
    //將進(jìn)程TabTip.exe拉起,如果是進(jìn)程存在的情況下,再次調(diào)用會(huì)直接顯示鍵盤(pán)界面
    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)用觸摸鍵盤(pán)的方式

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

 
    //觸摸鍵盤(pán)有一設(shè)置項(xiàng):不處于平板電腦模式且未連接鍵盤(pán)時(shí)顯示觸摸鍵盤(pán),增加延遲避開(kāi)系統(tǒng)調(diào)用鍵盤(pán)
    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組件的接口才能將鍵盤(pán)界面顯示出來(lái)
    if (10 == version.GetMajor() && version.GetPatch() >= 14393)
    {
        return OpenTabTipByCom(kTabTipPath);
    }
    else
    {
        return OpenTabTipByProcess(kTabTipPath);
    }
}

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

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

![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;
    }

    //觸摸鍵盤(pán)顯示和隱藏不能用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)在鍵盤(pán)不顯示時(shí)候只是多返回一個(gè)WS_DISABLED這個(gè)字段。所以加一個(gè)它的判斷
    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鍵盤(pán)代碼詳情的文章就介紹到這了,更多相關(guān)c++調(diào)用windows鍵盤(pán)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C/C++實(shí)操True and false詳解

    C/C++實(shí)操True and false詳解

    這篇文章主要給大家介紹了關(guān)于Python中常用的數(shù)據(jù)類(lèi)型bool(布爾)類(lèi)型的兩個(gè)值:True和False的相關(guān)資料,通過(guò)示例代碼給大家進(jìn)行了解惑,讓對(duì)這兩個(gè)值有所疑惑的朋友們能有起到一定的幫助,需要的朋友下面來(lái)一起看看吧。
    2021-09-09
  • C++實(shí)現(xiàn)連連看游戲核心代碼

    C++實(shí)現(xiàn)連連看游戲核心代碼

    這篇文章主要為大家詳細(xì)介紹了C++實(shí)現(xiàn)連連看游戲核心代碼,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-01-01
  • Qt將數(shù)據(jù)庫(kù)中的數(shù)據(jù)導(dǎo)出為html

    Qt將數(shù)據(jù)庫(kù)中的數(shù)據(jù)導(dǎo)出為html

    這篇文章主要為大家詳細(xì)介紹了Qt如何實(shí)現(xiàn)將數(shù)據(jù)庫(kù)中的數(shù)據(jù)導(dǎo)出為html,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2024-12-12
  • C++淺析內(nèi)聯(lián)函數(shù)的使用

    C++淺析內(nèi)聯(lián)函數(shù)的使用

    為了消除函數(shù)調(diào)用的時(shí)空開(kāi)銷(xiāo),C++ 提供一種提高效率的方法,即在編譯時(shí)將函數(shù)調(diào)用處用函數(shù)體替換,類(lèi)似于C語(yǔ)言中的宏展開(kāi)。這種在函數(shù)調(diào)用處直接嵌入函數(shù)體的函數(shù)稱(chēng)為內(nèi)聯(lián)函數(shù)(Inline Function),又稱(chēng)內(nèi)嵌函數(shù)或者內(nèi)置函數(shù)
    2022-05-05
  • C++ OpenCV實(shí)現(xiàn)圖像去水印功能

    C++ OpenCV實(shí)現(xiàn)圖像去水印功能

    本文將介紹如何使用OpenCV C++ 進(jìn)行簡(jiǎn)單圖像水印去除。我們?cè)诰W(wǎng)上download圖片時(shí),經(jīng)常因?yàn)榘鏅?quán)問(wèn)題有水印。本案例通過(guò)編寫(xiě)算法進(jìn)行簡(jiǎn)單水印去除。需要的可以參考一下
    2022-01-01
  • C語(yǔ)言文件操作 fopen, fclose, mkdir詳解

    C語(yǔ)言文件操作 fopen, fclose, mkdir詳解

    本文給大家詳細(xì)介紹了下C語(yǔ)言的文件操作函數(shù)fopen, fclose, mkdir的用法及示例,非常的簡(jiǎn)單實(shí)用,有需要的小伙伴可以參考下。
    2016-03-03
  • Qt?多語(yǔ)言程序設(shè)計(jì)的實(shí)現(xiàn)

    Qt?多語(yǔ)言程序設(shè)計(jì)的實(shí)現(xiàn)

    本文主要介紹了Qt?多語(yǔ)言程序設(shè)計(jì)的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-01-01
  • C++ Boost MetaStateMachine定義狀態(tài)機(jī)超詳細(xì)講解

    C++ Boost MetaStateMachine定義狀態(tài)機(jī)超詳細(xì)講解

    Boost是為C++語(yǔ)言標(biāo)準(zhǔn)庫(kù)提供擴(kuò)展的一些C++程序庫(kù)的總稱(chēng)。Boost庫(kù)是一個(gè)可移植、提供源代碼的C++庫(kù),作為標(biāo)準(zhǔn)庫(kù)的后備,是C++標(biāo)準(zhǔn)化進(jìn)程的開(kāi)發(fā)引擎之一,是為C++語(yǔ)言標(biāo)準(zhǔn)庫(kù)提供擴(kuò)展的一些C++程序庫(kù)的總稱(chēng)
    2022-12-12
  • StretchBlt函數(shù)和BitBlt函數(shù)用法案例詳解

    StretchBlt函數(shù)和BitBlt函數(shù)用法案例詳解

    這篇文章主要介紹了StretchBlt函數(shù)和BitBlt函數(shù)用法案例詳解,本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-08-08
  • 讓我們一起來(lái)對(duì)C語(yǔ)言指針再分析

    讓我們一起來(lái)對(duì)C語(yǔ)言指針再分析

    這篇文章主要為大家詳細(xì)介紹C語(yǔ)言的指針,本文進(jìn)行了深度解析,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助
    2022-01-01

最新評(píng)論

大石桥市| 全椒县| 高州市| 丹棱县| 扶绥县| 乌兰县| 高密市| 东城区| 平乐县| 嘉定区| 娄烦县| 方正县| 开阳县| 治多县| 仪陇县| 仁怀市| 宁陵县| 益阳市| 碌曲县| 巴楚县| 边坝县| 开远市| 应城市| 桃江县| 泽州县| 苗栗市| 巫溪县| 荣成市| 漠河县| 柯坪县| 巴塘县| 肥城市| 虎林市| 锡林浩特市| 忻州市| 西贡区| 柯坪县| 卫辉市| 油尖旺区| 华池县| 泗水县|