windows 怎么可能这么容易就偷到焦点?

px9o7tmv  于 2022-12-14  发布在  Windows
关注(0)|答案(2)|浏览(119)

在Windows 7上使用Outlook 2013,我创建了这个宏,只是为了测试它:

Private Sub Application_Reminder(ByVal Item As Object)
        Activeexplorer.Activate
End Sub

每当我使用不同的应用程序时,Outlook提醒就会触发,Outlook就会成为活动窗口,从我正在使用的应用程序中窃取焦点。
怎么可能?
我的意思是,我认为“Activeexplorer.Activate”方法使用了一些Windows API,如“SetForegroundWindow”或“SetActiveWindow”或其他一些API。
所有这些API都禁止窃取焦点,所以我的问题是Outlook vba方法如何能够如此容易和可怕地窃取焦点?
https://msdn.microsoft.com/it-it/library/windows/desktop/ms633539(v=vs.85).aspx所述,报警被部分解除,如果“前台锁定超时已过期(请参阅SystemParametersInfo中的SPI_GETFOREGROUNDLOCKTIMEOUT)”,则不在前台的其他进程可以使用SetForegroundWindow。
我在“HKCU:\Control Panel\Desktop”将注册表项“ForegroundLockTimeout”的值从零更改为20000,现在,在我的特定情况下,Outlook不会窃取焦点。
我想知道“ForegroundLockTimeout”注册表项的最大值是多少,或者,换句话说,是否有可能永久禁用任何其他不在前台的进程从活动应用程序窃取焦点。

k5ifujac

k5ifujac1#

以下是Windows未按预期运行的原因:
我已将位于“HKCU:\Control Panel\Desktop”的注册表项“ForegroundLockTimeout”的值从零更改为20000
该值一开始就不应该为零。您的系统中的某个程序(可能是很久以前)必须显式更改了此设置才能禁用前台锁定。这与Outlook本身无关。
我建议您将其设置回默认值which is 200,000,即200秒。
至于最大值,它必须适合DWORD,所以可能是49天左右,如果它在内部被当作一个有符号的值,那么大约是24天,把它设置得比一天长可能没有什么意义。

qxsslcnc

qxsslcnc2#

是的,SetForegroundWindow应该尊重前台窗口,只是 Flink 后台应用程序的任务栏,但有various hacks的人用来欺骗Windows和窃取焦点。
我更喜欢的通知用户重要信息的方法是将窗口移到顶部,而不占用键盘焦点。棘手的是要弄清楚传递哪个HWND,我不能仅仅通过在MSDN上查找来真正找到ActiveExplorer窗体的HWND属性。

Const HWND_TOP = 0
Const SWP_NOSIZE = &H1
Const SWP_NOMOVE = &H2
Const SWP_NOACTIVATE = &H10
Const SWP_SHOWWINDOW = &H40
Private Declare Sub SetWindowPos Lib "User32" (ByVal hWnd As Long, ByVal hWndInsertAfter As Long, ByVal X As Long, ByVal Y As Long, ByVal cx As Long, ByVal cy As Long, ByVal wFlags As Long)

...

SetWindowPos ??.hWnd, HWND_TOP, 0, 0, 0, 0, SWP_NOACTIVATE Or SWP_SHOWWINDOW Or SWP_NOMOVE Or SWP_NOSIZE

另一种方法是调用FlashWindow来 Flink 任务栏按钮,如果你没有权限获取焦点,SetForegroundWindow会这样做。

相关问题