从Delphi应用程序发送WM_COPY。 在Windows另一个进程7(Sending WM_

2019-10-17 11:51发布

我有一个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作为一个按键? (我不这么认为,微软肯定不会让周围的安全概念,最终运行)。

我会很感激任何意见,理顺我的想法......

Answer 1:

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



Answer 2:

你可以在这个系统中的Skype插件的Internet Explorer(IE选项 - 程序 - 添加附件)检查。 有了这个插件剪贴板上谁乱数据的bugy版本。 如果安装了这个插件,删除和测试。



文章来源: Sending WM_COPY from a Delphi app. to another process in Windows 7