gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 06:19:54 25 4
gpt4 key购买 nike

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

一旦输入有效的代码,该启动屏幕就会将该信息告知服务,并且服务将进入休眠状态 x 时间(取决于代码)。

启动画面直接退出。现在,当服务唤醒时,它会发现启动画面不再存在,因此启动它。

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

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

<小时/>

更新:

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

您可以通过设置更改行为:win32gui.SystemParametersInfo(win32con.SPI_SETFOOREGROUNDLOCKTIMEOUT, 0, 0)这相当于临时设置注册表值:HKEY_CURRENT_USER\控制面板\桌面\ForegroundLockTimeout这必须以用户本身的身份完成,因此要么在您要启动的应用程序中构建它,要么为您要启动的应用程序构建一个启动帮助程序。

但是,应用程序可能希望通过使用一些我现在不记得的 API 调用来防止其焦点被窃取。

一个可能好的解决方案是找到该用户当前的所有窗口句柄,然后使用每个句柄来使用 win32gui.ShowWindow(handle, command) 将其最小化。

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

如果有人想知道我如何设法从服务启动应用程序到桌面,这里有 link to the code .

最佳答案

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

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

关于python - 从 LocalSystem 服务(通过 CreateProcessAsUser)生成的 GUI 应用程序没有焦点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/860428/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com