[英]How to reliably steal/regain focus for MFC/desktop app on Windows 8.1/10?
[英]How can it be possible to steal focus so easily?
在 Windows 7 上使用 Outlook 2013,我創建了這個宏,只是為了測試它:
Private Sub Application_Reminder(ByVal Item As Object)
Activeexplorer.Activate
End Sub
每當我在不同的應用程序上工作並且 Outlook 提醒觸發時,Outlook 成為活動的 window 從我正在工作的應用程序中竊取焦點。
怎么可能??
我的意思是,我認為“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)。”
我將“HKCU:\Control Panel\Desktop”處的注冊表項“ForegroundLockTimeout”的值從零更改為 20000,現在,在我的特定情況下,Outlook 不會竊取焦點。
我想知道“ForegroundLockTimeout”注冊表項的最大值是多少,或者換句話說,是否可以永久禁用不在前台的任何其他進程從活動應用程序中竊取焦點。
這是 Windows 未按預期運行的原因:
我將“HKCU:\Control Panel\Desktop”中的注冊表項“ForegroundLockTimeout”的值從零更改為 20000
首先,該值不應該為零。 您的系統上的某些東西(可能是很久以前)必須明確更改此設置才能禁用前台鎖定。 這與 Outlook 本身無關。
我建議您將其設置回默認值,即 200,000 ,即 200 秒。
至於最大值,嗯,它必須適合一個DWORD
,所以可能大約 49 天。 如果在內部將其視為有符號值,大約需要 24 天。 將它設置為超過一天可能沒有什么意義。
是的, SetForegroundWindow
應該尊重前景 window 和 flash 后台應用程序的任務欄,但人們使用各種黑客來欺騙 Windows 並竊取焦點。
我首選的通知用戶重要事項的方法是在不竊取鍵盤焦點的情況下將 window 置於頂部。 棘手的一點是弄清楚要傳遞哪個 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
調用到 flash 任務欄按鈕,如果您沒有獲得焦點的權利, SetForegroundWindow
將執行此操作。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.