我有一个 Delphi (BDS 2006) 应用程序,它将击键发送到 QuickBooks 会计软件以遍历 QuickBooks 表单(发票),将文本从当前编辑控件复制到 Windows 剪贴板(以收集数据),根据收集的数据进行一些计算,最后通过发送击键将结果写在表单上。
这个应用程序已经开发了很多年,使用广泛的(至少对我而言)Windows API 技术来识别前景窗口、焦点窗口等,并被全局数十个用户使用......我只告诉你作为它在许多系统上工作的证据。
但不是所有的。最近我收到很多关于 Windows 7 系统的故障报告(QuickBooks 的版本似乎无关紧要)。发送给报告问题的客户的调试版本表明它没有将任何内容复制到剪贴板——尽管它似乎仍然能够执行其他所有操作(发送击键以遍历表单,并击键以粘贴计算结果...不幸的是,现在总是为零,因为没有收集到数据。)
这是我用来向 QuickBooks 中的编辑控制窗口发送 WM_COPY 消息的代码。 (在 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;
不想耗尽我们向其发送调试版本的最终用户的耐心,我正在寻找想法,然后再发送任何其他内容供他们尝试/测试......
笔记/问题:
我很感激任何评论以理清我的想法......
最佳答案
这可能与“用户界面特权隔离”(UIPI) 而不是 UAC 有关。检查每个进程的完整性级别。不允许低完整性进程向高完整性进程发送窗口消息,除非高完整性进程通过调用 ChangeWindowMessageFilter/Ex()
显式允许它。 .
关于delphi - 从 Delphi 应用程序发送 WM_COPY。到 Windows 7 中的另一个进程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13772136/