2017-09-04 62 views
-1

在Windows 7上使用Outlook 2013,我創造了這個宏,只是爲了測試它:如何才能夠輕鬆地竊取焦點?

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

每當我在不同的應用程序和一個Outlook提醒火災工作,前景逐漸從應用程序的活動窗口偷焦點我正在工作。

怎麼可能?

我的意思是,我認爲「Activeexplorer.Activate」方法使用了一些Windows API,比如「SetForegroundWindow」或者「SetActiveWindow」或者其他一些API。

所有這些apis都禁止竊取焦點,所以我的問題是Outlook vba方法如何能夠輕鬆和可怕地竊取焦點?

該報警部分解除武裝的,如在https://msdn.microsoft.com/it-it/library/windows/desktop/ms633539(v=vs.85).aspx所述,SetForegroundWindow可以通過其它方法沒有在前臺使用,如果「前景鎖定超時已過期(參見SPI_GETFOREGROUNDLOCKTIMEOUT在SystemParametersInfo)。」

我改變「HKCU:\ Control Panel \ Desktop」中的註冊表項「ForegroundLockTimeout」的值從零到20000,現在,在我的具體情況下,Outlook不會竊取焦點。

我不知道哪個是'ForegroundLockTimeout'註冊表項的最大值,或者換句話說,如果可以從活動應用程序永久禁用任何其他不在前景中的進程竊取焦點。

回答

0

是的,SetForegroundWindow應該是尊重前景窗口,只是閃爍的任務欄爲後臺應用程序,但有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閃爍的任務欄按鈕是如果你沒有抓住重點右邊什麼SetForegroundWindow會做。

+0

我對「黑客」不感興趣,在我的文章中不是黑客,它是一種標準的vba方法,在我看來這應該是不可能的,微軟不應該允許偷竊集中容易。 –

+0

找出Outlook是否使用hack的唯一方法是調試Activate方法。 – Anders

+0

你的黑客將窗口置於z列表的頂部而不激活不起作用,也就是說,除非將其設置爲最頂層而不激活它,然後在不激活它的情況下將其設置爲最頂層我知道沒有其他方式可以將其放置一個窗口,非最頂層窗口的頂部而不激活它: SetWindowPos的hWnd,HWND_TOPMOST,0,0,0,0,SWP_NOSIZE或者SWP_NOMOVE或者SWP_NOACTIVATE SetWindowPos的hWnd,HWND_NOTOPMOST,0,0,0,0,SWP_NOSIZE或者SWP_NOMOVE或SWP_NOACTIVATE –

1

這裏是預期的Windows並沒有表現的原因:

我改變了註冊表項「ForegroundLockTimeout」的價值在:從零「HKCU \控制面板\桌面」 20000

首先,該值不應該爲零。可能很久以前,系統上的某些內容必須明確更改此設置才能禁用前臺鎖定。這與Outlook本身無關。

我建議您將其設置恢復爲默認值which is 200,000,即200秒。

至於最大,它必須適合DWORD,所以可能大約49天。如果它在內部被視爲有符號值,大約24天。將它設置爲一天以上可能沒有多大意義。