基本上是抄了网上一个例子实现的,只是增加了一些错误提示 。调用点稍微改造就大功告成:
printf("%.*s\n", datalen, readBuffers);std::string gb2312 = utf8_to_gb2312(std::string((char *)readBuffers, datalen));copy_to_system_clipboard(gb2312);再次运行:
二维码长度:10浜琈D0926ready to copy data: 京MD0926copy to clipboard ok此时在任一文本框中按 Ctrl+V,均能得到号牌数据 。
这里请注意 copy_to_system_clipboard 中的 SetClipboardData 调用,使用 CF_TEXT 而不是 CF_UNICODETEXT,否则会得到下面的乱码输出:
????另外测试中发现可以同时启动多个 demo,相互之间不冲突,均能从接口拿到扫描后的数据,神奇 。
输出到当前光标上面的解决方案已经很好了,但是如果能像之前一样输出到光标就更棒了,用户可以无疑切换 。作为资深 MFCer,立刻想到了一种解决方案:查找当前桌面前台 (Foreground) 窗口,找到它的活动子窗口并投递 WM_SETTEXT 消息 。下面是参考网上一个例子的实现:
void set_text_to_active_windows(std::string const& data){ int ret = 0; std::wstring unicode; HWND wnd = GetForegroundWindow(); //HWND wnd = GetActiveWindow(); //HWND wnd = GetDesktopWindow(); if (wnd == NULL) { printf("no active windows\n"); return; } printf("get active window\n"); DWORD SelfThreadId = GetCurrentThreadId(); DWORD ForeThreadId = GetWindowThreadProcessId(wnd, NULL); if (!AttachThreadInput(ForeThreadId, SelfThreadId, true)) { printf("attach thread input failed\n"); return; } printf("attach thread input\n"); //wnd = GetFocus(); wnd = GetActiveWindow(); if (wnd == NULL) { printf("no focus windows\n"); return; } printf("get focus window\n"); AttachThreadInput(ForeThreadId, SelfThreadId, false); unicode = gb2312_to_unicode(data); ret = SendMessage(wnd, WM_SETTEXT, 0, (LPARAM)unicode.c_str()); printf("send text to active window return %d: %s\n", ret, data.c_str());}调用点仅需稍加改造就可以了:
printf("%.*s\n", datalen, readBuffers);std::string gb2312 = utf8_to_gb2312(std::string((char *)readBuffers, datalen));copy_to_system_clipboard(gb2312);set_text_to_active_windows(gb2312);编译运行,先启动一个 notepad 应用,将光标置于其中,便于稍后看输出结果,然而扫码后没有任何输出 。将上面的 GetForegroundWindow 替换为 GetActiveWindow 或 GetDesktopWindows 都没有效果,更神奇的是加的许多 printf 调试日志也没有输出,这真是见了鬼了:
open dev success!开始解码:二维码长度:10浜琈D0926ready to copy data: 京MD0926copy to clipboard oksend text to active window return 0: 京MD0926二维码长度:18LFV3A23C083027701ready to copy data: LFV3A23C083027701copy to clipboard oksend text to active window return 0: LFV3A23C083027701
经验总结扩展阅读
- 通过openlayers加载dwg格式的CAD图并与互联网地图叠加
- 互联网电视机哪个好 国产品牌小米果断上榜
- vivo互联网机器学习平台的建设与实践
- Go的网络编程详解
- bt是什么
- 三星手机互联网已停止如何修复
- 为什么互联网公司没有进入汽车终端领域
- MES与工业互联网的关联边界在哪里?
- 工业互联网领域的企业,都已经接入了ERP或者MES系统了吗?
- 互联网迷信是什么意思?