Определить, когда пользователь разблокирует рабочую станцию
Я пытаюсь определить, когда пользователь разблокирует свою рабочую станцию. Следующий код пытается зарегистрировать окно для получения сообщений об изменении сеанса с помощью WTSRegisterSessionNotification(). Предположительно, после этого я могу прослушать WM_WTSSESSION_CHANGE, который может содержать WTS_SESSION_UNLOCK в качестве параметра.
Проблема: в настоящее время WTSRegisterSessionNotification () всегда возвращает false.
Кто-нибудь знает, как мне этого добиться? Я на Windows 10, кстати.
var {remote} = require('electron');
var ffi = require('ffi');
var winctl = require('winctl');
var NOTIFY_FOR_ALL_SESSIONS = 1;
var WM_WTSSESSION_CHANGE = parseInt('0x02B1', 16);
var hwnd = remote.getCurrentWindow().getNativeWindowHandle();
var wtsapi32 = ffi.Library('wtsapi32', {
'WTSRegisterSessionNotification': [ 'bool', [ 'int', 'int' ] ]
});
// Attempt to register
var isregistered = wtsapi32.WTSRegisterSessionNotification(hwnd, NOTIFY_FOR_ALL_SESSIONS);
console.log(isregistered); // <----- RETURNS 0...?
Рекомендуется рекомендовать GetLastError(). Это не то, что поддерживается node-ffi, к сожалению. https://github.com/node-ffi/node-ffi/issues/261
2 ответа
Закончилось отказываться от этого. Я проверил, что HWND был правильным, но все равно не сработал по какой-то причине. В итоге я написал небольшую функцию на C# и выполнил ее из узла / электрона, используя node-edge.
Вы не должны использовать winctl.GetActiveWindow
чтобы получить HWND, потому что вы на самом деле не знаете, какое окно активно. Насколько я могу сказать, вызовы GetActiveWindow GetForegroundWindow
внутренне, и это безумие по двум причинам:
- GetForegroundWindow возвращает окно переднего плана на рабочем столе пользователя и может быть окном в другом приложении.
- Windows имеет фактическую функцию с именем GetActiveWindow, и это не то же самое, что вызов GetForegroundWindow.
Создайте скрытое собственное окно как-нибудь или используйте окно, предоставленное Electron (GetTopLevelNativeWindow
возможно?)
GetLastError
возвращает неправильное значение, потому что вы вызываете его слишком поздно. Между вами и родной функцией Windows есть толстый слой, и что-то вызывает SetLastError
прежде чем вы восстановите контроль. Библиотека 'ffi' нуждается в способе указать, что вы хотите, чтобы она вызывала GetLastError от вашего имени сразу после вызова запрошенной функции.
И наконец, винда BOOL
имеет размер int, и я предполагаю, что node.js рассматривает его как байт?