使用java windows服务捕获windows事件

发布于 2024-10-31 04:47:23 字数 139 浏览 4 评论 0原文

我想通过 Windows 服务捕获锁定/解锁/启动/关闭/注销和登录事件,然后我想为每个事件触发一个函数,以便我可以捕获事件发生的时间。

我想通过 Windows 服务来完成此操作,这样我就不需要手动运行该程序。我想通过java语言来运行这个程序。

I want to capture lock/unlock/start/shutdown/log off and log on events through a windows service and then I want to fire a function for each event so that I can capture the time when Event occured.

I want to do this through a windows service so that I need not run the program manually. And I want to run this program through java language.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

蓝颜夕 2024-11-07 04:47:23

看起来您需要使用 JNA 并使用本机 Windows 调用编写捕获代码。

有一个类 java.awt.Robot这恰恰相反——模拟操作系统事件,但我不知道如何在纯Java中捕获事件。

Looks like you will need to use JNA and write the capture code with native Windows calls.

There is a class java.awt.Robot that does the reverse -- simulating OS events but I am not aware of the way to capture events in pure Java.

究竟谁懂我的在乎 2024-11-07 04:47:23

在 C# 中,这非常简单。我可以向您展示 C# 代码,如果您想使用 Java 作为语言,您可以将其转换为 Ja.Net。 (如果你真的想使用 JVM,这并没有多大帮助)。

  1. 创建空的 C# 服务。
  2. 在程序的 Main 方法中将 CanHandleSessionChangeEvent 属性设置为 true:

    /// <摘要>
    /// 应用程序的主入口点。
    /// 
    静态无效Main()
    {
        ServiceBase[] ServicesToRun;
        LogService logService = new LogService();
        logService.CanHandleSessionChangeEvent = true;
        ServicesToRun = 新的 ServiceBase[] 
        { 
            日志服务 
        };
        ServiceBase.Run(ServicesToRun);
    }
    
  3. 在服务实现中重写 OnSessionChange 事件,您可以在其中转储有关用户登录/注销和会话连接/断开连接的信息

    protected override void OnSessionChange(SessionChangeDescription changeDescription)
    {
        EventLog.WriteEvent(
            新的 EventInstance(100, 0, EventLogEntryType. 信息), 
            String.Format("原因:{0},SessionId:{1}",changeDescription.Reason,changeDescription.SessionId));
        base.OnSessionChange(changeDescription);
    }
    
  4. 注册服务,启动它并查看事件日志中的记录。

In C# it is pretty straightforward. I can show you code in C#, you can then convert it to Ja.Net if you want to use Java as a language. (if you actually want to use JVM, this won't help as much though).

  1. Create empty C# service.
  2. Inside your program Main method set CanHandleSessionChangeEvent property to true:

    /// <summary>
    /// The main entry point for the application.
    /// </summary>
    static void Main()
    {
        ServiceBase[] ServicesToRun;
        LogService logService = new LogService();
        logService.CanHandleSessionChangeEvent = true;
        ServicesToRun = new ServiceBase[] 
        { 
            logService 
        };
        ServiceBase.Run(ServicesToRun);
    }
    
  3. in service implementation override OnSessionChange event, where you can dump information on user logon/logoff and session connect/disconnect

    protected override void OnSessionChange(SessionChangeDescription changeDescription)
    {
        EventLog.WriteEvent(
            new EventInstance(100, 0, EventLogEntryType.Information), 
            String.Format("Reason: {0}, SessionId:{1}", changeDescription.Reason, changeDescription.SessionId));
        base.OnSessionChange(changeDescription);
    }
    
  4. Register service, start it up and see records in event log.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文