我的应用程序在被外部工具(通过 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 未运行时对其进行测试,而在它运行时(即使未加载此解决方案)它会在任何情况下将应用程序的行为更改为获得焦点。