-1

在 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所述,SetForegroundWindow 可由不在前台如果“前台锁定超时已过期(请参阅 SystemParametersInfo 中的 SPI_GETFOREGROUNDLOCKTIMEOUT)。”</p>

我将“HKCU:\Control Panel\Desktop”处的注册表项“ForegroundLockTimeout”的值从零更改为 20000,现在,在我的具体情况下,Outlook 不会窃取焦点。

我想知道哪个是“ForegroundLockTimeout”注册表项的最大值,或者换句话说,是否可以永久禁用不在前台的任何其他进程从活动应用程序中窃取焦点。

4

2 回答 2

1

以下是 Windows 未按预期运行的原因:

我将 'HKCU:\Control Panel\Desktop' 的注册表项 'ForegroundLockTimeout' 的值从零更改为 20000

该值一开始就不应该为零。您的系统上的某些东西,可能很久以前,必须明确更改此设置才能禁用前台锁定。这与 Outlook 本身无关。

我建议您将其设置回默认值,即 200,000,即 200 秒。

至于最大值,嗯,它必须适合一个DWORD,所以大概是 49 天。如果它在内部被视为一个有符号值,大约是 24 天。将其设置为超过一天可能没有什么意义。

于 2017-09-05T00:40:51.263 回答
0

是的,SetForegroundWindow应该尊重前台窗口,只为后台应用程序闪烁任务栏,但人们使用各种黑客手段来欺骗 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以闪烁任务栏按钮,SetForegroundWindow如果您无权获取焦点,这将执行此操作。

于 2017-09-04T10:34:36.980 回答