1

我创建了一项服务,该服务在特定用户的桌面上显示一种启动屏幕,并且仅在该用户登录时(信息亭用户)。

该启动屏幕一旦输入有效代码,就会告诉服务并且服务进入睡眠 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) 将其最小化。

尽管对于这个特殊问题,设置锁定超时设置就足够了。

如果有人想知道我是如何设法将应用程序从服务启动到桌面的,这里是代码的链接

4

2 回答 2

2

您是否尝试过从服务中启动其他进程而不是您自己的进程以查看它是否获得焦点?像记事本一样,看看它是否会从您的浏览器中窃取焦点?如果是这样,也许它的程序可以在启动时收回焦点。

否则我相信它是来自 STARTUPINFO 结构的 wShowWindow 属性, lpStartupInfo 指向的应该控制它。您还需要 dwFlags 中的 STARTF_USESHOWWINDOW 才能使用 nShowWindow。我认为这些值应该是 SW_SHOW,如果你想尝试其他的,它们是为 ShowWindow 函数列出的。

于 2009-05-13T22:18:23.503 回答
0

出于各种非常正当的原因,微软不希望看到服务启动应用程序并窃取焦点,但是我发现以下工作仍然可以完成我想要的。

最初的意图是让一个类似信息亭的应用程序受到像闪屏这样的密码的阻碍,当输入一个 8 个字符的代码时,它会在定义的密码中关闭闪屏一段时间。最初要使用的实际应用程序是由自动启动文件夹启动的。

但是我现在重写它是从我的服务启动的,这样我可以通过从服务中启动一个帮助应用程序来隐藏应用程序,该服务只是隐藏程序并启动启动屏幕,退出启动屏幕后程序返回到以前的状态。

于 2009-05-21T09:44:09.150 回答