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; }