1
我開發一個需要得到在應用程序運行時,我目前正在執行一個呼叫到GetForegroundwindow()每隔半秒一直處於活動狀態的窗口名的應用程序,但是這很難準確,我不想把它設置爲100ms的時間間隔,我認爲這很糟糕,不準確,是否有任何系統事件可以爲我做到這一點?當GetForegroundWindow()發生更改時,是否有任何系統事件觸發?
謝謝。
我開發一個需要得到在應用程序運行時,我目前正在執行一個呼叫到GetForegroundwindow()每隔半秒一直處於活動狀態的窗口名的應用程序,但是這很難準確,我不想把它設置爲100ms的時間間隔,我認爲這很糟糕,不準確,是否有任何系統事件可以爲我做到這一點?當GetForegroundWindow()發生更改時,是否有任何系統事件觸發?
謝謝。
- 更新 -
你可以使用SetWindowsHookEx監視當前桌面,但這並不在託管代碼工作。相反,您必須使用SetWinEventHook。
你問如何使用SetWinEventHook P/Invoke方法。這裏是你的答案:
首先確保這條線是在你的代碼文件的頂部:
Imports System.Runtime.InteropServices
接下來,聲明所有你需要調用電話:
Public Const WINEVENT_OUTOFCONTEXT = &H0
'' Events are ASYNC
Public Const WINEVENT_SKIPOWNTHREAD = &H1
'' Don't call back for events on installer's thread
Public Const WINEVENT_SKIPOWNPROCESS = &H2
'' Don't call back for events on installer's process
Public Const WINEVENT_INCONTEXT = &H4
'' Events are SYNC, this causes your dll to be injected into every process
Public Declare Function SetWinEventHook Lib "user32.dll" _
(eventMin As UInteger, _
eventMax As UInteger, _
hmodWinEventProc As IntPtr, _
lpfnWinEventProc As IntPtr, _
idProcess As UInteger, _
idThread As UInteger, _
dwflags As UInteger) As IntPtr
Public Declare Function UnhookWinEvent Lib "user32.dll" _
(hWinEventHook As IntPtr) As <MarshalAs(UnmanagedType.Bool)> Boolean
Public Delegate Sub WinEventProc(_
hWinEventHook As IntPtr, _
[event] As UInteger, _
hwnd As IntPtr, _
idObject As Integer, _
idChild As Integer, _
dwEventThread As UInteger, _
dwmsEventTime As UInteger)
下一頁,你聲明一個函數和一個新變量作爲函數的地址函數:
Public Sub EventCallBack(_
hWinEventHook As IntPtr, _
[event] As UInteger, _
hwnd As IntPtr, _
idObject As Integer, _
idChild As Integer, _
dwEventThread As UInteger, _
dwmsEventTime As UInteger)
' Some code goes here
End Sub
Private eventProc As New WinEventProc(AddressOf EventCallBack)
Private hEventHook As IntPtr
Fin盟友,你將其結合在一起,和你通過下面的代碼行創建你的鉤子(0和255爲任意數字,你想要觀看的最小和最大消息代碼替換它們):
hEventHook = SetWinEventHook(0, _
255, _
IntPtr.Zero, _
Marshal.GetFunctionPointerForDelegate(eventProc), _
0, _
0, _
WINEVENT_OUTOFCONTEXT)
當你的程序已經完成了以下行添加到應用程序終止事件,或窗體的Dispose或無法最終確定方法:
UnhookWinEvent(hEventHook)
而這個運行在我的測試應用程序如預期。
不要忘記調用CallNextHookEx方法()當您完成,使得被鉤到桌面其它程序繼續正常工作。 –
好吧,我從來沒有與調用SetWindowsHookEx或鉤一般工作過,並且該鏈接只有C++ xyntax,你可以提供什麼,我想在vb.net代碼做一個適當的聲明? 這似乎有點讓我困惑,謝謝。 – SomeNickName
當然,給我一秒鐘。 –