Windows有两种方式接收签名图:
- WM_COPY_DATA 消息,默认方式。参考help目录下的Demo。
- 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;
}