【问题标题】:Raise "global" events in .NET via executable通过可执行文件在 .NET 中引发“全局”事件
【发布时间】:2009-10-02 19:51:14
【问题描述】:

我不知道该怎么做,以及要搜索什么......

我想要一个“引发事件”的简单可执行文件。我知道,这听起来很疯狂,很可能是用错误的术语来描述的。让我们回过头来描述一下场景:

我刚买了一支不错的 Wacom Pen + Touch。我还有一个带有一些 Fance 按钮的 Logitech MX 激光鼠标。而且我的键盘也有一些不错的功能按钮......所以有很多方法可以控制东西,我倾向于在 .NET 和 WPF 中做“一切”(希望在不久的将来)......

但问题是,我没有时间深入研究每个驱动程序以确保它们“原生地”与 .NET 一起工作。但大多数配置应用程序(wacom、setpoint)允许将应用程序分配给按钮。

所以我的想法是只为一个目的编译一个简单的可执行文件:在调用时引发事件。类似“WacomButton1Pressed.exe”的东西。

我知道 WCF,但我认为这太过分了,应用程序不需要连接到 Web 服务。 .NET 中是否还有其他“松散耦合”模型允许我订阅“全局事件”。我对应用程序域了解一点,对于初学者来说,假设一切都在最低安全级别运行(GAC 已关闭,我是管理员,Windows 7)...

在操作系统级别是否有一些“全局”事件代理(例如,类似于 PRISM 中的 EventAggregator),我可以在其中引发和监听事件。如果没有,任何关于几乎不需要“详细知识”的解决方法的想法(这是一种低优先级的游戏,所以一方面,我想“正确”地做,另一方面,我可以'不要花太多时间进行基础研究:-)

感谢您的任何提示, 克里斯

PS:欢迎使用搜索词,Event 不是谷歌最友好的词 :-)

【问题讨论】:

    标签: .net events


    【解决方案1】:

    我知道您已经考虑并驳回了 WCF,但我建议您重新考虑。 WCF 不仅仅是 Web 服务 - 基本上,当您需要跨进程(无论是在同一台机器内部还是跨机器边界)进行通信时,它应该是您默认的通信堆栈选择。

    您可以将命名管道与 WCF 一起使用,这就是我在这种情况下会做的事情。

    【讨论】:

    • 我会同意...WCF + 命名管道听起来是个不错的解决方案。
    • 好的,我想我会多玩一点 WCF。这似乎有点矫枉过正(我的印象是“服务器发现”需要时间),但这可能是由于调试构建和其他东西。将尝试一个小的“ping”应用程序,让我们看看它有多快(一开始的延迟将是关键部分)......
    • 也许我误解了这个问题。我认为他想响应来自任何外围设备的任何事件,而不管用户当前在做什么。因此,如果他在 Photoshop 中并且用户滚动他的 MouseWheel,他的应用程序应该会收到该事件。
    • 是的,在这个特定的问题中,我只关心“引发”全球事件。你提到的更多的是这个方向:stackoverflow.com/questions/1511682/…(相关但不同的问题)
    • @Christian:它可以在命名管道上相当快,但根据您的具体情况可能会有一点开销。我理解你的问题的方式我会说你可以让它工作得非常顺利,但我可能误解了一些东西。
    【解决方案2】:

    纯属猜测...您也许可以使用 WMI 来做到这一点。订阅某些 WMI 事件,并在被触发时以某种方式使用您的应用程序响应它们?

    【讨论】:

      【解决方案3】:

      正如其他人所说,WCF 不仅仅是 Web 服务,而且可能是最适合用于消息传递解决方案的 .NET 技术。

      我建议:

      • 定义一个简单的 WCF 服务和操作契约来处理事件
      • 创建一个简单的控制台应用程序,它是一个 WCF 服务主机,并实现契约;收到消息时,它可以弹出一个消息框或做任何你想做的事情。它不必是控制台应用程序,它可以是 WPF、Winform、Windows 服务,任何最合适的 - 任何 .NET 可执行文件都可以是 WCF 服务主机
      • 创建您的“WacomButton1Pressed.exe”实例化代理(或使用 ChannelFactory)以将消息发送到您的侦听器

      然后只需连接鼠标/输入设备按钮即可调用应用程序(如果它是控制台应用程序,您甚至可以使用配置工具传递命令行参数 - 即“WacomButtonPressed.exe -button1”

      当你想运行时,启动监听器,然后点击离开,它应该会发送消息。

      【讨论】:

        【解决方案4】:

        除了 WCF,Windows 实际上还有另一个“全局”事件代理:MSMQ

        如果您设置一个非事务性私有队列,它每秒可以处理数千甚至数万条消息(如果它们是小消息的话)(我的印象是它们会在这里)。

        那么你只需要让另一个应用轮询队列。

        MSMQ 有一个易于使用的 .NET API。

        唯一的缺点是您需要安装 MSMQ Windows 服务(它是自 Windows 2000 以来每个 Windows 版本的免费部分,但默认情况下不安装)。

        【讨论】:

        • 也很有趣,绝对值得一看。以前听说过这个词,但从来没有进入过...谢谢
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-04-10
        • 2010-10-25
        • 1970-01-01
        • 2012-06-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多