微光互联 TX800-U 扫码器无法输出中文到光标的问题( 四 )

基本上是抄了网上一个例子实现的,只是增加了一些错误提示 。调用点稍微改造就大功告成:
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

经验总结扩展阅读