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
当然,给我一秒钟。 –