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

Python 从LocalSystem服务(通过CreateProcessAsUser)派生的GUI应用程序没有焦点,python,windows-services,tkinter,pywin32,Python,Windows Services,Tkinter,Pywin32,我已经创建了一个服务,它在特定用户的桌面上显示一种启动屏幕,并且仅当该用户登录(kiosk用户)时才显示 一旦输入了有效代码,启动屏幕将告诉服务,服务将在x时间段内休眠(取决于代码) 启动屏幕简单地退出。现在,当服务醒来时,它发现飞溅物不再存在,因此启动它 这一切都在运行,唯一的问题是启动的应用程序没有焦点,也就是说,如果我在记事本中工作,时间到了,启动屏幕会显示在记事本后面(尽管是全屏) 我只需要担心Windows Vista,我使用win32扩展在Python中编写代码,但我相信当从Loca

我已经创建了一个服务,它在特定用户的桌面上显示一种启动屏幕,并且仅当该用户登录(kiosk用户)时才显示

一旦输入了有效代码,启动屏幕将告诉服务,服务将在x时间段内休眠(取决于代码)

启动屏幕简单地退出。现在,当服务醒来时,它发现飞溅物不再存在,因此启动它

这一切都在运行,唯一的问题是启动的应用程序没有焦点,也就是说,如果我在记事本中工作,时间到了,启动屏幕会显示在记事本后面(尽管是全屏)

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


更新: “问题”实际上是一个故意的限制,以防止像我这样的“恼人”应用程序窃取焦点

您可以通过设置以下内容来更改行为: win32gui.SystemParametersInfo(win32con.SPI_SETFOREGROUNDLOCKTIMEOUT,0,0) 这在临时设置注册表值时是等效的: HKEY\ U当前\用户\控制面板\桌面\前台锁定超时 这必须作为用户本身来完成,因此在您正在启动的应用程序中构建它,或者为您要启动的应用程序构建启动帮助程序

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

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

尽管对于这个特殊的问题,设置locktimeout已经足够了


如果有人想知道我是如何从服务启动一个应用程序到桌面的,这里有一个问题。

您是否尝试过从该服务启动另一个进程,而不是您自己的进程,以查看它是否得到关注?喜欢记事本,看看它是否会从浏览器中窃取焦点?如果是这样的话,也许是程序在启动时可以收回焦点


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

出于各种非常合理的原因,Microsoft不希望看到服务启动应用程序并窃取焦点,但是我发现以下方法仍然可以实现我想要的

最初的目的是让一个类似于kiosk的应用程序受到类似于通行码的闪屏的阻碍,该闪屏在输入8个字符的代码后关闭闪屏一段时间,如通行码中定义的那样。最初要使用的实际应用程序是由autostart文件夹启动的


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

是的,我设置了这些标志,谢谢你的提醒。我还将当前用户控制面板桌面中ForegroundLockTimeout的寄存器值设置为0。这在某种程度上有所帮助,有趣的是,它现在对大多数应用程序都起作用了,除了从记事本中窃取焦点:-)