QT集成Windows手写输入法
QT集成Windows手写输入法
关键词:qt、手写输入法、顾客签名
此 Demo 是利用 windows Tablet_PC_SDK 版本,实现的在Windows下实现手写识别,截签名按钮是将签名的区域截取保存成png图片,整体效果如下:
简介
- 此Demo使用QT Creator 4.11.0, Based on Qt 5.14.0 编写,大部分qt版本均适用。
- 开发编译时,需要安装 Tablet_PC_SDK,开发完毕后,实际部署时,不需要安装此SDK。
- Demo源码链接在本文最后提供。
使用步骤
Tablet_PC_SDK_v1.7.exe 安装此文件,此工程将此文件安装到了C:\MicrosoftTablet目录下,文件是开发SDK,开发完毕编译后,在部署的机器上不需要安装此文件;安装过程中,选择用户自定义安装 Custom,安装路径不要使用默认的,选择C:\MicrosoftTablet(没有则新建)。
此SDK可在以下链接中下载,或在本文最后提供的链接上下载。
https://getintopc.com/softwares/development/microsoft-tablet-pc-sdk-free-download/
在.pro中加入:
QT += axcontainer INCLUDEPATH +=C:\MicrosoftTablet\Include //此为SDK安装地址,注意不要使用默认的,因为有的QT不支持中文的()
在头文件中需包含以下头文件:
Windows_handwriting\hand\handsinput.h 头文件中包含了C:\MicrosoftTablet\Include 中的以下头文件: #include <msinkaut_i.c> #include <msinkaut.h>
直接编译会出错,需要注释掉以下文件中的两行:
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);
编译通过后,即可运行。
核心代码
此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手写输入法相关推荐
- 使用zinnia+qml制作手写输入法
今天逛git无意间发现了一个Qt写的手写输入法,对于手写输入法早就觊觎的我当然不能放过它. git源码奉上: https://github.com/penk/qml-handwriting 再来几张图 ...
- 如何在自己网站加入百度手写输入法?
最近百度不是跟汉王合作出了个手写输入法,还是云的,只要是云的都拿来借用一下. 所以搞了两个研究: 第一:如何在自己网站加入此输入法? 解决: 网上有一片通过修改JS文件能引入手写输入的,原文地址:ht ...
- Wince下的手写输入法
文章来源: http://www.xcar.com.cn/bbs/viewthread.php?tid=8193654&extra=&showthread=&page=1 作者 ...
- 联想笔记本那些有手写功能_联想笔记本如何使用vista自带的手写输入法tablet pc...
联想笔记本Vista自带一个手写输入法的软件tablet pc,该程序打开的方式有两种. 第一种方法: 1.点击快捷栏中的空白区域选择属性. 2.在弹出的窗口中选择工具栏并在tablet pc输入面板 ...
- 文通手写输入法g-fullscr乱码问题解决,哈
今天我也遇到了这个文通手写乱码问题,搞了半天.放到别的机器上好使,只有我自己的电脑是乱码.从网上google了半天,倒是很多说文通的手写输入法的乱码问题,但那些基本上说的解决方法没有一个管用的. 看我 ...
- WinCE手写输入法
我们专业从事各种平台的输入法开发,有多种wince 输入法,支持功能有: 1.手写识别,识别率达97%以上,可以连笔,笔顺无关: 2.智能拼音.全键盘拼音,9宫格拼音,可以整句输入法: 3.有智能笔画 ...
- 做了个面试题:使用TDD思想,用vue3集成自己手写的event bus。
一些集成的就比较简单就不介绍了,直接看单测 import { EventBus } from "../plugin/EventBus"; const bus = new Event ...
- 客户需要增加注音、繁体输入法,手写输入法
客户提出需求:增加注音.繁体输入法,手写输入法 ,应该如何操作? 其实不管增加什么输入法,就是要安装该种输入法,就像安装谷歌拼音输入法等是一样的,settings 里面不需要做什么额外的工作,主要是该 ...
- 手写html5游戏,HTML5 手写输入法
效果如下: 该查询文字接口免费,可自定义查询结果. handwritingapi.js QQShuru = {}; QQShuru.Util = {}; QQShuru.Util.Browser = ...
- js调用android手写输入法,手机进入页面,js调取软键盘
mui.plusReady(function(){ //调用软键盘 function open_soft_keyboard(options){ if(plus.os.name == 'iOS'){ s ...
最新文章
- [unreal4入门系列之六] 常用的按键和快捷键
- 鹅厂机器狗,站起来了!
- [链接]C++和Python版本的委托
- HDU 6682 Make Rounddog Happy
- C++中static与const成员
- tar (child): lbzip2: Cannot exec: No such file or directory 解决方法
- Go 远超 Python,机器学习人才极度稀缺,全球 16,655 位程序员告诉你这些真相!...
- 安装其他插件svn消失
- 软件架构——设计原则
- 【SEAN的日志】如何突破微信小程序2M限制?
- word插入页码后只有当前页有页码
- Windows编程之虚拟桌面实现原理
- java applet介绍,applet java 介绍
- 大数据对人们生活的积极影响_大数据对生活带来的影响
- Linux中的基础指令
- 前端字体图标的使用总结
- django Mezzanine uwsgi nginx 配置
- Linux查看流量情况以及关闭流量端口
- vue实现盒子的拖拽移动
- CDateTimeCtrl 用法总结
热门文章
- 八位超前进位加法器八位行波进位加法器
- Pandas数据库数据抽取
- 802.11n无线网卡驱动linux,Ubuntu 无线网卡驱动安装教程
- dell笔记本触摸板没反应怎么办,戴尔笔记本触摸面板用不了
- 【我为车狂性感车模win7主题】
- 文明4 java_文明4主题曲《Baba Yetu》(敬请关注中文歌词部分~)
- 创业 VS 阿里 | 当梦想遭遇现实,如何抉择?
- Web调用海康威视摄像头
- C++的 copy-and-swap idiom 是什么
- 信噪比 香农公式_「香农公式」信噪比/香农公式 - seo实验室