delphi - 从 Delphi 应用程序发送 WM_COPY。到 Windows 7 中的另一个进程

标签 delphi windows-7 manifest uac sendinput

我有一个 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 冲突引起的?我们的应用程序目前没有数字签名,也没有使用 list 。我一直在阅读有关在其中添加带有 UIAccess=True 的 list 的信息。但是,如果我们的应用程序已经可以毫无问题地向 QuickBooks 发送击键,那么设置 UIAccess=True 是否会对允许 SendMessageTimeout() 成功产生任何影响?我需要使用数字证书吗?让 UIAccess 设置有什么效果?
  • 如果在 list 中没有数字签名和 UIAccess 的情况下 SendMessage 将无法工作,我们是否可以退回到发送 Ctrl-C 作为击键? (我不这么认为;Microsoft 肯定不会允许围绕安全概念进行最终运行。)

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

    最佳答案

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

    关于delphi - 从 Delphi 应用程序发送 WM_COPY。到 Windows 7 中的另一个进程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13772136/

    相关文章:

    delphi - Fmx TStringGrid 行颜色

    C#写入注册表

    c# - 计算机重命名后调试

    android - ImageLoader 在使用前必须初始化配置

    java - 启动可执行 jar 时出错 - "Could not find or load main class"

    delphi - Delphi函数参数问题

    delphi - 如何在复合组件中发布子组件的属性?

    delphi - 将 Jpeg 图像转换为 Bmp - 某些图像显示为蓝色

    winforms - 桌面支付处理应用程序 : Switching APIs from Authorize.Net to Paypal

    java - jar list 类路径和-classpath命令行选项如何组合