Delphi:作为管理员的应用程序 运行 没有收到来自非管理员应用程序的消息

Delphi: application running as admin does not receive messages from non-admin app

我想使用 SendMessage/PostMessage 向另一个应用程序发送消息,但是当另一个应用程序是 运行 作为管理员时,它永远不会收到消息。如果没有 运行 "sending" 应用程序作为管理员,我该如何克服这个问题?

编辑:Remi 的答案代码,接收器应用程序

Const dummyValue = WM_USER + 71423;

  Application.HookMainWindow(AppClass.AppHookFunc);
  ChangeWindowMessageFilter(dummyValue, MSGFLT_ADD);

Type TAppClass = class
  function AppHookFunc(var Message : TMessage): Boolean;
end;

Var AppClass: TAppClass;

function TAppClass.AppHookFunc(var Message : TMessage): Boolean;
begin
  Result := False;
  Case Message.Msg of
    dummyValue: begin
      // do stuff
      //
      Result := True;
    end;
  end;
end;

User Interface Privilege Isolation (UIPI) 阻止完整性较低的进程向完整性较高的进程发送 window 消息。从软件角度处理此限制的唯一方法是:

  • 运行 您的发送应用程序处于更高的完整性级别(即,运行 它具有更高的权限)以匹配目标进程。

  • 如果您有权更改接收应用程序的源代码,请通过调用 [=17] 使其 opt-in 接收来自较低完整性进程的特定 window 消息=] 本身。

  • 通过在其 <requestedExecutionLevel> 应用程序清单元素中请求 uiaccess=true 让您的发送应用绕过 UIPI。但是,这有额外的要求:

    • 应用程序必须使用证书进行数字签名,该证书可以使用计算机上安装的根证书进行验证。

    • 应用程序必须安装在文件系统 1 的 "secure" 文件夹中(标准用户无法写入的文件夹)在 %ProgramFiles% 及其子目录,或 %WinDir% 及其子目录下(标准用户确实具有写入权限的几个子目录除外)。

      1:这个要求是configurable via a system policy.

在软件控制之外,唯一可用的其他选项需要更改系统策略以在系统级别完全禁用用户帐户控制 (UAC) and/or UIPI。你不应该这样做。