0

我试图检测用户何时解锁他们的工作站。以下代码尝试使用 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...?

IInspectable 推荐 GetLastError()。不幸的是,这不是 node-ffi 支持的。 https://github.com/node-ffi/node-ffi/issues/261

4

2 回答 2

0

您不应该winctl.GetActiveWindow用来获取 HWND,因为您实际上并不知道哪个窗口处于活动状态。据我所知GetForegroundWindow,内部调用 GetActiveWindow 很疯狂,原因有两个:

  1. GetForegroundWindow 返回用户桌面上的前景窗口,并且可能是另一个应用程序中的窗口。
  2. Windows 有一个名为 GetActiveWindow 的实际函数,它与调用 GetForegroundWindow 不同。

以某种方式创建一个隐藏的本机窗口或使用电子提供的窗口(GetTopLevelNativeWindow也许?)

GetLastError返回错误的值,因为您调用它为时已晚。在您和本机 Windows 功能之间有一层厚厚的东西,SetLastError在您重新获得控制权之前,有些东西正在调用。'ffi' 库需要一种方法来指定您希望它在调用请求的函数后立即代表您调用 GetLastError。

最后,WindowsBOOL是 int 大小的,我猜 node.js 将它视为一个字节?

于 2017-04-10T01:52:24.653 回答
0

最终放弃了这个。我验证了 HWND 是正确的,但无论出于何种原因它仍然无法工作。我最终在 C# 中编写了一个小函数,并使用 node-edge 从 node/electron 中执行它。

于 2017-04-10T14:01:49.400 回答