1

我有一个 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;

不想消耗我们向其发送调试版本的最终用户的耐心,我正在寻找想法,然后再发送任何其他内容供他们尝试/测试......

注释/问题:

  • 所有其他击键都是通过 SendInput 发送的,它们工作正常。我相信我们出于速度原因开始使用 SendMessageTimeout(WM_COPY) 而不是发送 Ctrl-C 作为击键 - 它允许我们在返回时立即访问剪贴板,而不是等待 Ctrl-C 的未知/无限时间由 QuickBooks 处理。

  • 我相信我们已经要求用户在我们的应用程序上尝试 RunAs...Administrator,但这没有任何效果(我必须验证是否已完成)。

  • 我想知道问题是否可能是由于 UAC 冲突引起的?我们的应用程序目前没有数字签名,也没有使用清单。我一直在阅读有关在其中添加带有 UIAccess=True 的清单的信息。但是,如果我们的应用程序已经可以毫无问题地向 QuickBooks 发送击键,那么设置 UIAccess=True 对允许 SendMessageTimeout() 成功有什么影响吗?我需要使用数字证书吗?让 UIAccess 设置有什么效果?

  • 如果在清单中没有数字签名和 UIAccess 的情况下 SendMessage 将无法工作,我们是否可以退回到发送 Ctrl-C 作为击键?(我不这么认为;微软肯定不会允许围绕安全概念进行最终运行。)

我很感激任何评论以理清我的想法......

4

2 回答 2

4

这可能与“用户界面特权隔离”(UIPI) 而不是 UAC 有关。检查每个进程的完整性级别。不允许低完整性进程向高完整性进程发送窗口消息,除非高完整性进程通过调用明确允许它ChangeWindowMessageFilter/Ex()

于 2012-12-07T22:44:16.850 回答
0

你能检查这个系统的 Internet Explorer Skype 插件吗(IE-选项-程序-附加组件)。这个插件有一个错误版本,会在剪贴板上弄乱数据。如果安装了此插件,请删除并测试。

于 2012-12-08T08:54:00.410 回答