【发布时间】:2013-07-22 08:05:34
【问题描述】:
当我的应用程序被外部工具(通过 API)调用时,它需要获得焦点,我知道默认设置是,它应该只在任务栏中闪烁,但在这种情况下,这绝对不是行为我想要的。在这种情况下,我尝试通过“this.Activate()”(C#)获得焦点。
这就是 ForeGroundLockTimeOut 发挥作用的地方。 但是,我在理解 SystemParameterInfo SPI_SETFOREGROUNDLOCKTIMEOUT 时遇到了一点问题。
我知道它用于设置 ForeGroundLockTimeOut,它定义了您的应用必须等待多长时间才能获得所需的焦点。
(有关更多信息,变量“val”是一个设置为 0 的 IntPtr)
SystemParametersInfo(SPI_SETFOREGROUNDLOCKTIMEOUT,0,val,SPIF_SENDWININICHANGE + SPIF_UPDATEINIFILE);
这将更改处理超时的注册表项 (HKEY_CURRENT_USER\Control Panel\Desktop\ForeGroundLockTimout) 由于这会改变所有应用程序的行为,因此它确实是最后的手段。
现在我想如果我不更新注册表项会怎样。所以我尝试了这个:
SystemParametersInfo(SPI_SETFOREGROUNDLOCKTIMEOUT, 0, val, 0);
但是它不会以任何方式改变我的应用程序的行为,但是
SystemParametersInfo(SPI_SETFOREGROUNDLOCKTIMEOUT,0,val,SPIF_SENDWININICHANGE);
会。
我不明白为什么这只适用于我的应用程序,这绝对是我想要的,但我不明白。为什么我必须广播一个只适用于我的应用程序的更改,当有没有对任何注册表项或任何内容进行任何更改,为什么这仅适用于我的应用程序。
注意:如果您想测试此行为,请在 Visual Studio 未运行时对其进行测试,而在它运行时(即使未加载此解决方案)它会在任何情况下将应用程序的行为更改为获得焦点。
【问题讨论】:
-
它在任何情况下都会改变应用程序的行为以获取焦点。你甚至 read the fine manual 吗? 系统限制哪些进程可以设置前台窗口。只有满足以下条件之一时,进程才能设置前台窗口: ... 正在调试前台进程。 你正在尝试做的事情让我想起了this。
-
也让我想起了this。
-
是的,我读过它,不,我不会尝试将我的窗口设置在最上面,它大部分时间都在后台运行,我希望它在通过 api 调用时获得焦点(会将其添加到问题中)但即使它有焦点也不应该是最重要的。
-
是的,它让我想起了this,但我确实想窃取焦点,而不是让其他应用程序给我,因为我并不总是能够修改外部工具的代码
标签: windows winforms winapi focus