2017-04-09 12 views
0

사용자가 워크 스테이션을 잠금 해제 할 때를 감지하려고합니다. 다음 코드는 WTSRegisterSessionNotification()을 사용하여 세션 변경 메시지를 수신하기 위해 창을 등록하려고 시도합니다. 이 후 필자는 WTS_SESSION_UNLOCK을 매개 변수로 포함 할 수있는 WM_WTSSESSION_CHANGE를 수신 할 수 있습니다.사용자가 워크 스테이션을 잠금 해제 할 때 감지합니다.

문제 : 현재 WTSRegisterSessionNotification()은 항상 false를 반환합니다.

누구나 내가 이것을 어떻게 달성 할 수 있는지 알고 있습니까? 저는 Windows 10 btw입니다.

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

+1

[documentation] (https://msdn.microsoft.com/en-us/library/aa383841.aspx)에서 : * "함수가 성공하면 반환 값은 TRUE이고, 그렇지 않으면 FALSE입니다. * 확장 된 오류 정보를 얻으려면 [GetLastError] (https://msdn.microsoft.com/en-us/library/ms679360.aspx)를 호출하십시오. ** "* * – IInspectable

+0

안녕하십니까. 불행히도 node-ffi를 사용할 때 옵션이 아닌 것 같습니다. 나는 그것을 포함하도록 질문을 수정했다. 또한 이것을 발견 : https://github.com/node-ffi/node-ffi/issues/261 –

+0

허. 그리고 누군가는 문제를 해결하는 데 어려움을 겪었고, 수정본은 결코 프로젝트에 통합되지 않았습니다. 나는 그것이 당신이 장님으로 날아간다는 것을 의미합니다. 아마도 당신을 대신하여 WTSRegisterSessionNotification을 호출하고 오류 코드를 반환하는 간단한 C DLL을 작성할 수 있습니까? –

답변

0

이 문제를 해결하기 위해 나는 HWND가 정확하다는 것을 확인했지만 어떤 이유로 든 작동하지 않을 것이다. C#에서 작은 함수를 작성하고 node-edge를 사용하여 노드/전자에서 실행했습니다.

0

실제로 어떤 창이 활성 상태인지 알지 못하기 때문에 winctl.GetActiveWindow을 사용하면 HWND를 가져올 수 없습니다. 지금까지 내가 말할 수있는 GetActiveWindow 내부 GetForegroundWindow를 호출하고 그 이유는 두 가지 미친 짓 : 사용자의 바탕 화면에 전경 창을 반환하고 다른 응용 프로그램의 창 수 GetForegroundWindow

  1. .
  2. Windows에는 GetActiveWindow라는 실제 함수가 있으며 GetForegroundWindow를 호출하는 것과 다릅니다.

은 (아마도 GetTopLevelNativeWindow?) 전자에서 제공하는 창을 숨겨진 기본 창을 어떻게 든 만들거나 사용하는 당신이 너무 늦게 호출하기 때문에

GetLastError가 잘못된 값을 반환합니다. 너와 네이티브 윈도우 기능 사이에는 두꺼운 층의 물건이 있는데, 다시 회복하기 전에 뭔가가 SetLastError이라고 부른다. 'ffi'라이브러리는 요청 된 함수를 호출 한 직후에 GetLastError를 호출하도록 지정하는 방법이 필요합니다.

마지막으로 Windows BOOL은 int 크기이며 node.js가이를 바이트로 처리합니다.

+0

답변 해 주셔서 감사합니다. Electron에서 제공 한 getNativeWindowHandle() 함수를 사용하도록 전환했습니다. 나는 또한 반환 형식을 bool 대신 int로 설정하려고 시도했지만 차이를 만들지 않습니다. 아직도 운이 없다. –

+0

시도 할 항목 : IsWindow Windows 함수를 호출하여 핸들이 유효한지 확인하십시오. GetWindowThreadProcessId를 호출하여 HWND가 GetCurrentProcessId와 동일한 프로세스에 있는지 확인합니다.진정한 오류 코드를 파악할 수 있도록 디버거에서 실행하십시오. – Anders

+0

감사합니다. 핸들이 유효하다는 것을 확인했지만 여전히 작동하지 않습니다. 노드 가장자리를 사용하여 실행 한 C# 메서드 작성을 마쳤습니다. –