手册

签名图自定义传递方法

1634
文子
2022-03-04 18:31:17
摘要:多文输入法签名功能,签名图传递方法

Windows有两种方式接收签名图:


  1. WM_COPY_DATA 消息,默认方式。参考help目录下的Demo。
  2. signSender.exe 插件。位置在:\bin\windows32_qt5.9.4[vs2015]\plugins\。默认带的插件也是通用 WM_COPY_DATA 消息传递,你可以重写这个插件,代码如下。

 

Linux只能重写  signSender插件。

位置:\bin\linux_xxx[xxx]\ plugins\

代码如下:


#include <QCoreApplication>
#include <QUrl>
#if defined(Q_OS_WIN)
#include <windows.h>
#endif
  
  
int main(int argc, char * argv[])
{
    QCoreApplication a(argc, argv);
    QList<QString> arguments = QCoreApplication::arguments();
   
    // 调用:signSender.exe 参数1 参数2 参数3
    if (arguments.size() >= 3)
    {
        QString txt = QUrl::fromPercentEncoding(arguments[1].toLatin1());   // 参数1:签名识别结果,仅做参考。
        QString file = QUrl::fromPercentEncoding(arguments[2].toLatin1());  // 参数2:签名图完整路径
        QString orgTxt;
    
        // 参数3: 调用签名时传入的字符串,用途由开发者自己定义【可有可无】
        if (arguments.size() >= 4)
            orgTxt = QUrl::fromPercentEncoding(arguments[3].toLatin1());    
      
#if defined(Q_OS_WIN)
        // Windows 平台下,发消息完成传递,主程序要接收这个 WM_COPYDATA 消息
        DWORD dwResult;
        UINT uEvent = WM_COPYDATA;//RegisterWindowMessageW(L"dwime_sign_file");
        UINT uTimeout = 200;
        COPYDATASTRUCT   cds;
   
        QString data = txt + "\n" +
                file.replace("/", "\\") + "\n" +
                orgTxt;
   
        const ushort * dataW =  data.utf16();
   
        memset(&cds,0,sizeof(cds));
        cds.dwData   = 'sign';  // 0x7369676e
        cds.cbData   = sizeof(wchar_t) * (data.length() + 1);
        cds.lpData   = (void*)dataW;
   
        SendMessageTimeout(HWND_BROADCAST,
                           uEvent,
                           'sign', (LPARAM)&cds,
                           SMTO_ABORTIFHUNG, uTimeout, &dwResult);
#else
        // 其它平台,可以通过共享内存、共享文件、http、WEBSocket、或者QLocalServer 等方式传递
#endif
   
    }
   
    return 0;
}