【问题标题】:Event when machine has been locked/unlocked (Electron Windows)机器被锁定/解锁时的事件(Electron Windows)
【发布时间】:2020-12-02 00:02:26
【问题描述】:

所以我有一些任务需要在用户锁定他们的机器时得到通知。这是为了暂停这些任务。同样,我需要知道机器何时成功解锁才能恢复所述任务。这纯粹是针对仅 Windows 的功能,因此不需要跨平台。

我查看了 Electron 文档并找到了关于 powerMonitor API 的 this,但是它只有 suspendresume 的事件。我假设他们指的是机器进入睡眠状态,因为锁定和解锁不会在我的机器上触发它们(Win 10)。

我对核心 Windows 的工作原理及其消息/事件系统知之甚少。但是我发现this 列出了有关WM_WTSSESSION_CHANGE 的信息,这似乎是我需要的。尤其是WTS_SESSION_LOCK (0x7)WTS_SESSION_UNLOCK (0x8) 状态码。

但是,我无法找到一种使用电子或 NodeJS 直接收听 Windows 消息的方法。

任何关于该问题的建议将不胜感激。谢谢

【问题讨论】:

  • 有解决办法吗?
  • 怕不是,因为这个,我前段时间把它放下了。

标签: node.js windows electron


【解决方案1】:

以防万一有人回答这个老问题,powerMonitor 现在支持两个事件:lock-screenunlock-screen,所以你可以(在主进程中):

const {powerMonitor} = require("electron");

powerMonitor.addListener('lock-screen', () => {
  // Screen is locked, do something
});

powerMonitor.addListener('unlock-screen', () => {
  // Screen is unlocked, do something else
});



【讨论】:

    【解决方案2】:

    您可以使用“electron-edge-js”来做到这一点

    解决办法如下:

    if( process.platform == 'win32' || process.platform == 'win64' ) {
        var edge = require( 'electron-edge-js' );
    
        var checkLockStatus = edge.func( function() {/*
            using System;
            using System.Threading.Tasks;
            using Microsoft.Win32;
            using System.Collections.Generic;
    
            public class Startup : IDisposable
            {
                private Func<object, Task<object>> callbackFn;
                public async Task<object> Invoke(IDictionary<string, object> input)
                {
                    callbackFn = (Func<object, Task<object>>)input["callbackFn"];
                    SystemEvents.SessionSwitch += SystemEvents_SessionSwitch;
                    return null;
    
                }
    
                public async void SystemEvents_SessionSwitch(object sender, SessionSwitchEventArgs e)
                {
                     if (e.Reason == SessionSwitchReason.SessionLock)
                    {
                        callbackFn( "locked" );
                    }
                    else if (e.Reason == SessionSwitchReason.SessionUnlock)
                    {
                       callbackFn( "unlocked" );
                    }
                }
    
                public void Dispose()
                {
                    SystemEvents.SessionSwitch -= SystemEvents_SessionSwitch;
                }
            }
        */} );
    
        checkLockStatus( {
            callbackFn: function( state ) {
                console.log( state );
            }
        } );
    }
    

    【讨论】:

      猜你喜欢
      • 2020-01-12
      • 2010-10-16
      • 1970-01-01
      • 2018-08-09
      • 1970-01-01
      • 2018-11-18
      • 2012-07-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多