node.js - Hændelse, når maskinen er låst/oplåst (Electron Windows)

Indlæg af Hanne Mølgaard Plasc

Problem



Så jeg har nogle opgaver, som jeg har brug for at blive underrettet, når brugeren låser deres maskine. Dette er for at pausere disse opgaver. Ligeledes har jeg brug for at vide, hvornår maskinen har været låst op med henblik på at genoptage de nævnte opgaver. Dette er udelukkende til en Windows-funktion, så det behøver ikke at være cross-platform.


Jeg har kigget igennem Electron docs og fundet dette om API'en powerMonitor, men det har kun begivenheder for suspend og resume. Jeg formoder, at de henviser til, at maskinen skal sove som låsning og un-locking udløser dem ikke på min maskine (Win 10). [8]


Jeg ved meget lidt af, hvordan kerne Windows fungerer, med sine meddelelser/arrangement system. Men jeg har fundet dette, som indeholder oplysninger om WM\_WTSSESSION\_CHANGE, som synes at være, hvad jeg har brug for. Navnlig WTS\_SESSION\_LOCK (0x7) og WTS\_SESSION\_UNLOCK (0x8) statuskoder. [9]


Men jeg kan ikke finde en måde enten med elektron eller NodeJS direkte for at lytte til Windows-meddelelser.


Eventuelle råd om problemet ville blive meget værdsat. Tak

Bedste reference


Du kan gøre dette ved hjælp af 'elektron-kant-js'


Her er løsningen:


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 );
        }
    } );
}