Node.js 机器已锁定/解锁时的事件(电子窗口)

Node.js 机器已锁定/解锁时的事件(电子窗口),node.js,windows,electron,Node.js,Windows,Electron,因此,我有一些任务需要在用户锁定机器时通知我。这是为了暂停这些任务。同样,我需要知道机器何时成功解锁,以便恢复上述任务。这纯粹是针对Windows的功能,因此不需要跨平台 我查看了电子文档,发现了关于powerMonitorAPI的内容,但是它只有suspend和resume的事件。我假设他们将要睡眠的机器称为锁定,解除锁定不会在我的机器上触发它们(Win 10) 我对核心Windows及其消息/事件系统的工作原理知之甚少。然而,我找到了关于WM\uwtssession\uchange的列表信息

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

我查看了电子文档,发现了关于
powerMonitor
API的内容,但是它只有
suspend
resume
的事件。我假设他们将要睡眠的机器称为锁定,解除锁定不会在我的机器上触发它们(Win 10)

我对核心Windows及其消息/事件系统的工作原理知之甚少。然而,我找到了关于
WM\uwtssession\uchange
的列表信息,这似乎是我所需要的。特别是
WTS\u会话锁定(0x7)
WTS\u会话解锁(0x8)
状态代码

然而,我找不到一种直接使用electron或NodeJS来收听Windows消息的方法


对这个问题的任何建议都将不胜感激。谢谢

您可以使用“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 );
        }
    } );
}
if(process.platform=='win32'| | process.platform=='win64'){
var edge=require('electron edge js');
var checkLockStatus=edge.func(函数(){/*
使用制度;
使用System.Threading.Tasks;
使用Microsoft.Win32;
使用System.Collections.Generic;
公共类启动:IDisposable
{
私有函数callbackFn;
公共异步任务调用(IDictionary输入)
{
callbackFn=(Func)输入[“callbackFn”];
SystemEvents.SessionSwitch+=SystemEvents\u SessionSwitch;
返回null;
}
public async void SystemEvents\u SessionSwitch(对象发送方,SessionSwitchEventArgs e)
{
if(e.Reason==SessionSwitchReason.SessionLock)
{
callbackFn(“锁定”);
}
else if(e.Reason==SessionSwitchReason.SessionUnlock)
{
callbackFn(“解锁”);
}
}
公共空间处置()
{
SystemEvents.SessionSwitch-=SystemEvents\u SessionSwitch;
}
}
*/} );
检查锁状态({
callbackFn:函数(状态){
console.log(状态);
}
} );
}

为了防止有人最终遇到这个老问题,现在支持两个事件:
锁定屏幕
解锁屏幕
,因此您可以(在主流程中):


有解决办法吗?恐怕没有。不,我不久前就因为这个把它记下来了。
const {powerMonitor} = require("electron");

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

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