我有一个Delphi(BDS 2006)应用程序,它发送键击的QuickBooks会计软件遍历QuickBooks的形式(发票),从目前的编辑控件文本复制到Windows剪贴板(收集数据),请根据所收集的数据进行一些计算,最后通过发送击键写在表格上的结果。
此应用程序已经发展了数年,用途广泛(至少对我来说)的Windows API技术来识别前台窗口,重点窗口等,由数十名世界各地的用户所使用的......我只能告诉你作为证据,它适用于很多系统。
但不是所有的。 最近我得到了很多失败的报道,在Windows 7系统(QuickBooks的版本似乎并不重要)。 发送给谁已经报告的问题客户调试版本,表明它没有任何复制到剪贴板 - 尽管它似乎仍然是能够做到的一切(发送键击穿越的形式,并且在按键的计算结果粘贴......不幸的是,现在始终为零,因为没有数据收集。)
下面是我用它来发送WM_COPY消息在QuickBooks编辑控件窗口中的代码。 (我们不能得到这个代码在这里失败,在任XP或Windows 7系统 - 但它并没有几个用户的工作。)
var
iResult : DWORD;
begin
...
//Edit control has the focus on the QB form, so try to copy its contents
if SendMessageTimeout(Wnd, WM_COPY, 0, 0,
SMTO_ABORTIFHUNG or SMTO_NORMAL,
2000,
iResult) = 0 then begin //0 = Failed or timed out
//NOTE: Users DO NOT get the following message--the
//SendMessageTimeout() simply returns without error, as if the
//WM_COPY is being sent correctly.
ShowMessage('SendMessageTimeout FAILED');
Abort;
end;
//At this point, the clipboard has nothing on it, on users'
//machines where it fails to work.
...
end;
不想穿出来给谁我们发送调试版本,我正在寻找的想法之前,我们发出任何其他为他们尝试/测试最终用户的耐心...
备注/问题:
所有其他按键通过SendInput发送,和他们很好地工作。 我相信,我们开始而不是发送按Ctrl-C作为速度的原因击键使用SendMessageTimeout(WM_COPY) - 它允许,而不是等待的时间未知/不确定大写金额为Ctrl-C来我们立即访问返回剪贴板,由QuickBooks的处理。
我相信我们已经要求用户尝试在我们的应用程序运行方式...管理员,但没有任何效果(我必须验证的被完成)。
我想知道,如果这个问题可能是由于UAC的冲突? 我们的应用程序目前未进行数字签名,并使用不带清单。 我一直在阅读有关将清单与UIAccess =真在里面。 但是,如果我们的应用程序已经可以发送击键QuickBooks的没有问题,将设置UIAccess =真有让SendMessageTimeout()的成功有什么影响? 而将我需要使用数字证书。 拿到UIAccess设置有什么影响?
如果SendMessage函数将没有在清单进行数字签名和UIAccess工作,是有可能,我们可以回落到发送按Ctrl-C作为一个按键? (我不这么认为,微软肯定不会让周围的安全概念,最终运行)。
我会很感激任何意见,理顺我的想法......