背景故事:我正在使用Electron创建一个应用程序,并且我正在尝试在计算机锁定/解锁时运行一个函数。
经过多次试验和错误后,我终于设法让以下python代码正常工作。当相关代码被触发时,代码在屏幕上打印Locked或Unlocked。我现在需要从Node JS运行python脚本,以便在事件触发时运行更多函数。
import win32con
import win32gui
import win32ts
import time
print("Test")
WM_WTSSESSION_CHANGE = 0x2B1class WTSMonitor():
className = "WTSMonitor"
wndName = "WTS Event Monitor"
def __init__(self):
wc = win32gui.WNDCLASS()
wc.hInstance = hInst = win32gui.GetModuleHandle(None)
wc.lpszClassName = self.className
wc.lpfnWndProc = self.WndProc
self.classAtom = win32gui.RegisterClass(wc)
style = 0
self.hWnd = win32gui.CreateWindow(self.classAtom, self.wndName,
style, 0, 0, win32con.CW_USEDEFAULT, win32con.CW_USEDEFAULT,
0, 0, hInst, None)
win32gui.UpdateWindow(self.hWnd)
win32ts.WTSRegisterSessionNotification(self.hWnd, win32ts.NOTIFY_FOR_ALL_SESSIONS)
def start(self):
win32gui.PumpMessages()
def stop(self):
win32gui.PostQuitMessage(0)
def WndProc(self, hWnd, message, wParam, lParam):
if message == WM_WTSSESSION_CHANGE:
self.OnSession(wParam, lParam)
def OnSession(self, event, sessionID):
if event == 7:
print("Locked")
if event == 8:
print("Unlocked")
print(event)
myststa(event)
WTSMonitor().start()
节点代码:
const { spawn } = require('child_process');
let py = spawn('python',['locked.py'])
py.stdout.on('data', data => console.log('data : ', data.toString()))
py.on('close', ()=>{
})
当我使用" Python locked.py"从控制台运行python时我看到打印的测试信息。但是,当使用node locked.js运行时,脚本看起来像是在运行但从未打印到控制台。
另外要提的是,如果我注释掉最后一行WTSMonitor()。start(),那么我可以看到测试消息打印到节点控制台。
答案 0 :(得分:0)
在开始实际故障排除之前,使用python调用w32api的主要原因是什么?首先你可以通过电子/ nodejs本身来做,而且电子将直接在powerMonitor中有一个特定事件(https://github.com/electron/electron/blob/3a0640993ba9748ced9f9cd00de5dbfe7651f788/docs/api/power-monitor.md#event-lock-screen-macos-windows)并不一定需要第三方代码。