从LocalSystem服务(通过CreateProcessAsUser)生成的GUI应用程序没有焦点

时间:2009-05-13 21:04:41

标签: python windows-services tkinter pywin32

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

这个启动画面一旦输入有效代码,就会告诉服务,服务会进入睡眠状态x一段时间(取决于代码)。

启动画面只是退出。现在,当服务唤醒时,它会看到启动不再存在,所以启动它。

这一切都正常,唯一的问题是启动的应用程序没有焦点,即如果我在记事本中工作且时间到了,则会在记事本后面显示启动画面(全屏幕)。

我只需要担心Windows Vista,我使用win32扩展编写Python,但我相信当从LocalSystem帐户调用时,问题在于CreateProcessAsUser。


更新

“问题”实际上是一个故意限制,以防止像我这样的“刺激性”应用程序窃取焦点。

您可以通过设置更改行为: win32gui.SystemParametersInfo(win32con.SPI_SETFOREGROUNDLOCKTIMEOUT,0,0) 这相当于临时设置注册表值: HKEY_CURRENT_USER \ Control Panel \ Desktop \ ForegroundLockTimeout 这必须以用户自己的身份完成,因此要么在您正在启动的应用程序中构建它,要么为要启动的应用程序构建启动帮助程序。

然而,应用程序可能希望通过使用我现在不记得的一些API调用来防止它的焦点被盗。

一个可能很好的解决方案是找到当前来自该用户的所有窗口句柄,然后使用这些句柄中的每一个来使用win32gui.ShowWindow(句柄,命令)来最小化它。

虽然针对此特定问题设置锁定超时设置已足够。

如果有人想知道我是如何设法通过服务向桌面启动应用程序的,那么这是一个link to the code

2 个答案:

答案 0 :(得分:2)

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

我另外认为它是来自STARTUPINFO结构的wShowWindow属性,lpStartupInfo指向应控制它的那个。您还需要dwFlags中的STARTF_USESHOWWINDOW才能使用nShowWindow。值得应该是SW_SHOW我认为,如果你想尝试其他的话,它们会被列为ShowWindow函数。

答案 1 :(得分:0)

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

最初的目的是让像应用程序这样的信息亭受到启动代码的阻碍,例如启动画面,在输入8个字符的代码时会关闭启动画面一段时间,就像在定义的密码中一样。最初使用的实际应用程序是由autostart文件夹启动的。

但是我现在重写了它是从我的服务启动的,这样我就可以通过从隐藏程序并启动启动画面的服务启动一个帮助应用程序来隐藏应用程序,在退出启动画面时程序是回到了以前的状态。