QT集成Windows手写输入法

关键词:qt、手写输入法、顾客签名

此 Demo 是利用 windows Tablet_PC_SDK 版本,实现的在Windows下实现手写识别,截签名按钮是将签名的区域截取保存成png图片,整体效果如下:

简介

  1. 此Demo使用QT Creator 4.11.0, Based on Qt 5.14.0 编写,大部分qt版本均适用。
  2. 开发编译时,需要安装 Tablet_PC_SDK,开发完毕后,实际部署时,不需要安装此SDK。
  3. Demo源码链接在本文最后提供。

使用步骤

  1. Tablet_PC_SDK_v1.7.exe 安装此文件,此工程将此文件安装到了C:\MicrosoftTablet目录下,文件是开发SDK,开发完毕编译后,在部署的机器上不需要安装此文件;安装过程中,选择用户自定义安装 Custom,安装路径不要使用默认的,选择C:\MicrosoftTablet(没有则新建)。

    此SDK可在以下链接中下载,或在本文最后提供的链接上下载。

    https://getintopc.com/softwares/development/microsoft-tablet-pc-sdk-free-download/
    
  2. 在.pro中加入:

    QT       += axcontainer
    INCLUDEPATH +=C:\MicrosoftTablet\Include  //此为SDK安装地址,注意不要使用默认的,因为有的QT不支持中文的()
    
  3. 在头文件中需包含以下头文件:

    Windows_handwriting\hand\handsinput.h 头文件中包含了C:\MicrosoftTablet\Include 中的以下头文件:
    #include <msinkaut_i.c>
    #include <msinkaut.h>
    
  4. 直接编译会出错,需要注释掉以下文件中的两行:

    C:\MicrosoftTablet\Include\msinkaut.h 中的:
    475行://void * __RPC_USER MIDL_user_allocate(size_t);C:\MicrosoftTablet\Include\tpcshrd.h 中的:
    59行://void * __RPC_USER MIDL_user_allocate(size_t);
    
  5. 编译通过后,即可运行。

核心代码

此Demo的核心代码如下,可以根据SDK自行编码调试,或下载源码修改调试:

void handsInput::inputInit(HWND hwnd)
{// 初始化 COM 接口CoInitialize(NULL);HRESULT hr;// 使用默认的识别器创建一个识别上下文// 这个上下文会被所有的识别对象使用hr = CoCreateInstance(CLSID_InkRecognizerContext,NULL, CLSCTX_INPROC_SERVER,IID_IInkRecognizerContext,(void **) &g_pIInkRecoContext);if (FAILED(hr)) {qDebug() << "没有安装手写识别软件=";return ;}// 创建一个墨迹收集对象hr = CoCreateInstance(CLSID_InkCollector,NULL, CLSCTX_INPROC_SERVER,IID_IInkCollector,(void **) &g_pIInkCollector);if (FAILED(hr))return ;// 获取墨迹对象的指针hr = g_pIInkCollector->get_Ink(&g_pIInkDisp);if (FAILED(hr))return ;// 将墨迹对象关联一个 hWnd 的窗口hr = g_pIInkCollector->put_hWnd((long)hwnd);if (FAILED(hr))return ;// 设置颜色IInkDrawingAttributes* p;if (SUCCEEDED(g_pIInkCollector->get_DefaultDrawingAttributes(&p))){p->put_Color(RGB(0,0,255));}// 打开墨迹输入的开关hr = g_pIInkCollector->put_Enabled(VARIANT_TRUE);if (FAILED(hr))return ;#if 1//设置手写只识别为一个字IInkRecognizerGuide *RecognizerGuide;hr = CoCreateInstance(CLSID_InkRecognizerGuide,NULL, CLSCTX_INPROC_SERVER,IID_IInkRecognizerGuide,(void **) &RecognizerGuide);if (FAILED(hr))return;InkRecoGuide recoguide;RECT rect;rect.bottom = 2;//不能为1rect.left = 0;rect.right = 2;//不能为1rect.top = 0;recoguide.rectWritingBox = rect;recoguide.rectDrawnBox = rect;recoguide.cRows = 1;//不要过大recoguide.cColumns = 1;recoguide.midline = -1;RecognizerGuide->put_GuideData(recoguide);g_pIInkRecoContext->putref_Guide(RecognizerGuide);
#endif
}void handsInput::RegDataEx(InPutRltS &Rlts)
{// 将鼠标变为沙漏//   HCURSOR hCursor = ::SetCursor(::LoadCursor(NULL, IDC_WAIT));// 获取指向墨迹收集器的指针// 这个收集器是整个墨迹的快照if (!Rlts.empty()){Rlts.clear();}IInkStrokes* pIInkStrokes = NULL;HRESULT hr = g_pIInkDisp->get_Strokes(&pIInkStrokes);if (SUCCEEDED(hr)){// 将笔触收集器传递给识别器hr = g_pIInkRecoContext->putref_Strokes(pIInkStrokes);if (SUCCEEDED(hr)){// 识别IInkRecognitionResult* pIInkRecoResult = NULL;InkRecognitionStatus RecognitionStatus = IRS_NoError;hr = g_pIInkRecoContext->Recognize(&RecognitionStatus, &pIInkRecoResult);if (SUCCEEDED(hr) && (pIInkRecoResult!= NULL)){// 枚举可能的所有结果//                CComPtr<IInkRecognitionAlternates> spIInkRecoAlternates;IInkRecognitionAlternates* spIInkRecoAlternates;hr = pIInkRecoResult->AlternatesFromSelection(0,                              // in: selection start-1,                             // in: selection length; -1 means "up to the last one"10,                               // in: the number of alternates we're interested in&spIInkRecoAlternates           // out: the receiving pointer);long lCount = 0;if (SUCCEEDED(hr) && SUCCEEDED(spIInkRecoAlternates->get_Count(&lCount))){// 获取所有的识别结果IInkRecognitionAlternate* pIInkRecoAlternate = NULL;for (LONG iItem = 0; (iItem < lCount) && (iItem < 10); iItem++){// Get the alternate string if there is oneif (SUCCEEDED(spIInkRecoAlternates->Item(iItem, &pIInkRecoAlternate))){BSTR bstr = NULL;if (SUCCEEDED(pIInkRecoAlternate->get_String(&bstr))){InputRlt temp = {0};QString str = QString::fromWCharArray(bstr);//qDebug() << "字体=" << str.toUtf8().data();strcpy(temp.rlt, str.toUtf8().data());Rlts.push_back(temp);}pIInkRecoAlternate->Release();}}//枚举结束,显示出来}}// 重置识别器内容g_pIInkRecoContext->putref_Strokes(NULL);}pIInkStrokes->Release();}// 重置鼠标//  ::SetCursor(hCursor);
}

QT集成Windows手写输入法相关推荐

  1. 使用zinnia+qml制作手写输入法

    今天逛git无意间发现了一个Qt写的手写输入法,对于手写输入法早就觊觎的我当然不能放过它. git源码奉上: https://github.com/penk/qml-handwriting 再来几张图 ...

  2. 如何在自己网站加入百度手写输入法?

    最近百度不是跟汉王合作出了个手写输入法,还是云的,只要是云的都拿来借用一下. 所以搞了两个研究: 第一:如何在自己网站加入此输入法? 解决: 网上有一片通过修改JS文件能引入手写输入的,原文地址:ht ...

  3. Wince下的手写输入法

    文章来源: http://www.xcar.com.cn/bbs/viewthread.php?tid=8193654&extra=&showthread=&page=1 作者 ...

  4. 联想笔记本那些有手写功能_联想笔记本如何使用vista自带的手写输入法tablet pc...

    联想笔记本Vista自带一个手写输入法的软件tablet pc,该程序打开的方式有两种. 第一种方法: 1.点击快捷栏中的空白区域选择属性. 2.在弹出的窗口中选择工具栏并在tablet pc输入面板 ...

  5. 文通手写输入法g-fullscr乱码问题解决,哈

    今天我也遇到了这个文通手写乱码问题,搞了半天.放到别的机器上好使,只有我自己的电脑是乱码.从网上google了半天,倒是很多说文通的手写输入法的乱码问题,但那些基本上说的解决方法没有一个管用的. 看我 ...

  6. WinCE手写输入法

    我们专业从事各种平台的输入法开发,有多种wince 输入法,支持功能有: 1.手写识别,识别率达97%以上,可以连笔,笔顺无关: 2.智能拼音.全键盘拼音,9宫格拼音,可以整句输入法: 3.有智能笔画 ...

  7. 做了个面试题:使用TDD思想,用vue3集成自己手写的event bus。

    一些集成的就比较简单就不介绍了,直接看单测 import { EventBus } from "../plugin/EventBus"; const bus = new Event ...

  8. 客户需要增加注音、繁体输入法,手写输入法

    客户提出需求:增加注音.繁体输入法,手写输入法 ,应该如何操作? 其实不管增加什么输入法,就是要安装该种输入法,就像安装谷歌拼音输入法等是一样的,settings 里面不需要做什么额外的工作,主要是该 ...

  9. 手写html5游戏,HTML5 手写输入法

    效果如下: 该查询文字接口免费,可自定义查询结果. handwritingapi.js QQShuru = {}; QQShuru.Util = {}; QQShuru.Util.Browser = ...

  10. js调用android手写输入法,手机进入页面,js调取软键盘

    mui.plusReady(function(){ //调用软键盘 function open_soft_keyboard(options){ if(plus.os.name == 'iOS'){ s ...

最新文章

  1. [unreal4入门系列之六] 常用的按键和快捷键
  2. 鹅厂机器狗,站起来了!
  3. [链接]C++和Python版本的委托
  4. HDU 6682 Make Rounddog Happy
  5. C++中static与const成员
  6. tar (child): lbzip2: Cannot exec: No such file or directory 解决方法
  7. Go 远超 Python,机器学习人才极度稀缺,全球 16,655 位程序员告诉你这些真相!...
  8. 安装其他插件svn消失
  9. 软件架构——设计原则
  10. 【SEAN的日志】如何突破微信小程序2M限制?
  11. word插入页码后只有当前页有页码
  12. Windows编程之虚拟桌面实现原理
  13. java applet介绍,applet java 介绍
  14. 大数据对人们生活的积极影响_大数据对生活带来的影响
  15. Linux中的基础指令
  16. 前端字体图标的使用总结
  17. django Mezzanine uwsgi nginx 配置
  18. Linux查看流量情况以及关闭流量端口
  19. vue实现盒子的拖拽移动
  20. CDateTimeCtrl 用法总结

热门文章

  1. 八位超前进位加法器八位行波进位加法器
  2. Pandas数据库数据抽取
  3. 802.11n无线网卡驱动linux,Ubuntu 无线网卡驱动安装教程
  4. dell笔记本触摸板没反应怎么办,戴尔笔记本触摸面板用不了
  5. 【我为车狂性感车模win7主题】
  6. 文明4 java_文明4主题曲《Baba Yetu》(敬请关注中文歌词部分~)
  7. 创业 VS 阿里 | 当梦想遭遇现实,如何抉择?
  8. Web调用海康威视摄像头
  9. C++的 copy-and-swap idiom 是什么
  10. 信噪比 香农公式_「香农公式」信噪比/香农公式 - seo实验室