【问题标题】:What kind of windows applications can receive system events?什么样的windows应用程序可以接收系统事件?
【发布时间】:2010-10-19 16:00:33
【问题描述】:

什么样的windows应用可以接收系统事件? 我的意思是像用户关闭的事件。 Windows 窗体、WPF 应用程序和 Windows 服务可以做到这一点。但我不知道其他任何人。

【问题讨论】:

  • 是否存在您尝试为其捕获系统事件的特定类型的 Windows 应用程序?
  • 我已经用一个 Windows 窗体应用程序和一个 WPF 应用程序完成了这项工作。我在 Vista 上的 WPF 版本和 Win 7 上的 Windows Forms 版本上遇到了一些问题;但那是另一回事了。我只是想知道(即)C# 中的控制台应用程序是否可行?谢谢

标签: c# .net wpf windows


【解决方案1】:

基于 Windows 窗体和 WPF 的图形应用程序本机侦听一些 Windows API 事件。命令行和其他类型可以订阅这些事件,但您必须编写该代码。

更新:

这是一篇关于从托管应用程序接收 Win32 API 事件的文章:

http://www.codeproject.com/KB/cs/interopevents.aspx

请注意,您的应用程序必须正在运行才能接收事件,因此如果您想从控制台应用程序执行此操作,您的应用程序必须启动并保持运行,直到某些外部信号导致它关闭。

【讨论】:

  • 能否请您指导我学习如何使用控制台应用程序完成的教程或其他内容?非常感谢!
  • @Wonko_the_Sane 那么我应该在这里问什么样的问题?你很肯定会像你一样判断人!你是一个伟大的开发者!恭喜!
  • @Dave_Swersky 因为我需要启动和退出事件,所以我找到了另一种方法。对于开始,我只执行我需要的代码,然后 System.Windows.Forms.Application.ApplicationExit.AddHandler(fun s e -> what_ever_on_end );; Application.Run() 并且有效!再次感谢!
【解决方案2】:

获取这样的事件需要一个窗口和一个消息循环。窗口由 SystemEvents 处理,消息循环自动存在于 WPF 或 winforms 应用程序中。

如果您在其他类型的应用程序(如服务或控制台模式应用程序)中使用它,创建一个专用线程就足够聪明了。您将在调试器 (Debug + Windows + Threads) 中看到名为“.NET SystemEvents”的线程。当您的应用在非交互式 Windows 工作站(如服务)中运行或您的 Main 方法没有 [STAThread] 属性(如控制台应用)时,就会发生这种情况。

您的代码中不需要任何特殊内容即可订阅该事件。但请注意,您的事件处理程序将在此帮助线程上运行,可能需要与 lock 关键字同步。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-06-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-25
    • 1970-01-01
    相关资源
    最近更新 更多