我创建了一项服务,该服务在特定用户的桌面上显示一种启动屏幕,并且仅在该用户登录时(信息亭用户)。
该启动屏幕一旦输入有效代码,就会告诉服务并且服务进入睡眠 x 时间量(取决于代码)。
启动画面简单地退出。现在,当服务唤醒时,它会看到飞溅不再存在,因此启动它。
这一切正常,唯一的问题是启动的应用程序没有焦点,即如果我在记事本中工作并且时间到了,则在记事本后面显示启动画面(虽然是全屏)。
我只需要担心 Windows Vista,我在 Python 中使用 win32 扩展进行编码,但我相信这个问题出在从 LocalSystem 帐户调用时的 CreateProcessAsUser 上。
更新:
“问题”实际上是一个故意限制,以防止像我这样的“烦人”应用程序窃取焦点。
您可以通过设置更改行为: win32gui.SystemParametersInfo(win32con.SPI_SETFOREGROUNDLOCKTIMEOUT, 0, 0) 相当于临时设置注册表值:HKEY_CURRENT_USER\Control Panel\Desktop\ForegroundLockTimeout 这必须作为用户自己完成,所以要么构建它在您正在启动的应用程序中或为您要启动的应用程序构建启动助手。
但是,应用程序可能希望通过使用一些我现在不记得的 API 调用来防止其焦点被盗。
一个可能很好的解决方案是找到当前来自该用户的所有窗口句柄,然后使用这些句柄中的每一个来使用 win32gui.ShowWindow(handle, command) 将其最小化。
尽管对于这个特殊问题,设置锁定超时设置就足够了。
如果有人想知道我是如何设法将应用程序从服务启动到桌面的,这里是代码的链接。