侦听其他应用程序中的事件

Listen for events in another application

提问人:lomaxx 提问时间:8/20/2008 最后编辑:Bill the Lizardlomaxx 更新时间:11/18/2021 访问量:32714

问:

假设我有两个用 C# 编写的应用程序。第一个是第三方应用程序,它引发一个名为“OnEmailSent”的事件。

第二个是我编写的自定义应用程序,即使是第一个应用程序,我也想以某种方式订阅“OnEmailSent”。

有没有办法以某种方式将第二个应用程序附加到第一个应用程序的实例以侦听“OnEmailSent”事件?


因此,为了进一步澄清,我的具体方案是我们有一个用 c# 编写的自定义第三方应用程序,它引发了“OnEmailSent”事件。我们可以使用反射器看到事件存在。

我们想要做的是在这个组件发送电子邮件时执行一些其他操作。

我们能想到的最有效的方法是能够像 anders 建议的那样使用某种形式的 IPC,并监听第三方组件引发的 OnEmailSent 事件。

由于该组件是用 C# 编写的,因此我们正在考虑编写另一个 C# 应用程序的想法,该应用程序可以将自身附加到正在执行的进程,并且当它检测到 OnEmailSent 事件已被引发时,它将执行自己的事件处理代码。


我可能遗漏了一些东西,但根据我对远程处理工作原理的理解,需要有一个服务器来定义客户端可以订阅的某种协定。

我更多地考虑了一个场景,例如,有人编写了一个独立的应用程序,例如 outlook,它公开了我想从另一个应用程序订阅的事件。

我想我正在考虑的场景是 .net 调试器以及它如何附加到正在执行的程序集以在运行时检查代码。

C# 事件 委托

评论


答:

1赞 Mark Cidade 8/20/2008 #1

可以使用远程处理或 WCF。参见 http://msdn.microsoft.com/en-us/library/aa730857(VS.80).aspx#netremotewcf_topic7

3赞 lubos hasko 8/20/2008 #2

您可以尝试 Managed Spy 和编程访问 ManagedSpyLib

ManagedSpyLib 引入了一个类 称为 ControlProxy。ControlProxy 是 a 的表示形式 System.Windows.Forms.Control 中的 另一个过程。ControlProxy 允许 你获取或设置属性和 像订阅一样订阅活动 在目标内部运行 过程。将 ManagedSpyLib 用于 自动化测试,事件记录 兼容性,跨进程 通信或白盒测试。

但这可能不适合您,这取决于 ControlProxy 是否可以以某种方式访问您在第三方应用程序中所追求的事件。

您也可以使用 Reflexil

反射允许 IL 修改通过使用强大的 由 Jb 编写的 Mono.Cecil 库 伊万。Reflexil 作为 Reflector 插件运行,并且 特别针对 IL 代码 处理。它通过以下方式实现这一点 提出完整的指令 编辑器并允许 C#/VB.NET 代码 注射。

0赞 Coincoin 8/20/2008 #3

来自该第三方应用程序的 OnEmailSent 事件的性质是什么?我的意思是,你怎么知道应用程序正在触发这样的事件?

如果你打算进行进程间通信,你应该问自己的第一个问题是:这真的有必要吗?

在不质疑你的动机的情况下,如果你真的需要进行进程间通信,你将需要某种机制。这个名单很长,很长。从简单的WM_DATA消息到自定义 TCP 协议,再到需要额外基础结构的非常复杂的 Web 服务。

这就带来了一个问题,你到底想做什么?您无法控制的第三方应用程序是什么?

此外,调试器具有非常侵入性的调试过程方式。不要指望这是所有其他应用程序使用的标准进程间机制。事实上,事实并非如此。

0赞 Mark Cidade 8/20/2008 #4

使用 SQL Server 2005 查询更改通知,可以通过 .NET 应用程序维护持久性 SqlConnection,在数据库中的数据发生更改之前进行阻塞。

请参见 http://www.code-magazine.com/article.aspx?quickid=0605061

14赞 Anders Sandvig 8/20/2008 #5

为了使两个应用程序(单独的进程)交换事件,它们必须就这些事件的通信方式达成一致。有许多不同的方法可以做到这一点,确切地使用哪种方法可能取决于体系结构和上下文。进程之间这种信息交换的总称是进程间通信 (IPC)。存在许多执行 IPC 的标准方法,最常见的是文件、管道、(网络)套接字、远程过程调用 (RPC) 和共享内存。在 Windows 上,使用窗口消息也很常见。

我不确定这如何适用于 Windows 上的 .NET/C# 应用程序,但在本机 Win32 应用程序中,您可以挂接到外部进程的消息循环并“监视”它们发送的消息。如果程序在调用所需函数时生成消息事件,这可能是检测该事件的一种方式。

如果您自己实现这两个应用程序,则可以选择使用您喜欢的任何 IPC 方法。如今,网络套接字和基于套接字的更高级别的协议(如 HTTP、XML-RPC 和 SOAP)非常流行,因为它们也允许您在不同的物理机器上运行应用程序(因为它们是通过网络连接的)。

0赞 Martin 11/17/2021 #6

也可能WM_COPYDATA,请参阅我 https://social.msdn.microsoft.com/Forums/en-US/eb5dab00-b596-49ad-92b0-b8dee90e24c8/wmcopydata-event-to-receive-data-in-form-application?forum=winforms 将其用于类似的 Purose(通知选项已更改)

在我们的 C++/CLI 方案 (MFC-) 中,程序使用 COPYDATASTRUCT-Member lpData 中的 Information-String 进行WM_COPYDATA通信 (参数列表,如“Caller=xyz Receiver=abc Job=dosomething”)。此外,C#-App 可以接收WM_COPYDATA消息,如链接中所示。从 C#(到已知的大型机句柄)发送WM_COPYDATA是由 cpp/cli-Assembly 完成的(我没有证明如何在 C# 中发送 WMCOPYDATA)。

PS 在 Cpp/CLI 中,我们将 AfxGetMainWnd()->m_hWnd 作为 WMCOPYDATA-Message 的 WPARAM 发送,而在 C# (WndProc) 中,m.WParam 可以用作发送WM_COPYDATA

评论

1赞 Community 11/17/2021
您的答案可以通过额外的支持信息得到改进。请编辑以添加更多详细信息,例如引文或文档,以便其他人可以确认您的答案是正确的。您可以在帮助中心找到有关如何写出好答案的更多信息。