激活后台程序的窗口 V1.1
最后修订:2010-3-14 By:Topses 如何激活后台程序的窗口,使其成为前台窗口,这个问题看似简单,对于新手来说却有一些麻烦 我们开始时肯定都会用(SetWindowPos,SwitchToThisWindow,BringWindowToTop,SetForegroundWindow)这几个函数来进行操作,这些函数对一个特定的输入线程来说是“本地的”——换言之,倘若某窗口并非前台应用程序的一部分,那么一旦随同该窗口调用本函数,仍会将窗口带至它自己那个应用程序的窗口列表顶部。但是,不会同时使那个应用成为前台应用程序。这意味着在调用了本函数后,窗口仍会保持隐藏状态。 就是说,如果在自己的进程内调用时可以的,如果想激活其他的进程的窗口就不行了(程序只是在任务栏里闪动),Microsoft 在 Win2k/xp 下已经削弱了这些函数的功能(见MSDN)。 所以基于此,以上函数在调试中执行可能有效,但是在编译后(EXE)以下代码均无效,(无效是指达不到激活窗口为前台),因为在调试时VBE与调试的程序是在一个线程当中。 方法一,AttachThreadInput连接线程函数
如果要把其它进程的窗口带到前台需要调用AttachThreadInput,它可以将一个线程的输入处理机制连接到另一个线程。
Private Sub Timer1_Timer()
Dim lThread As Long, lCurThreadId As Long, lProcess As Long, lResult As Long
'获取创建前台窗口的线程
lThread = GetWindowThreadProcessId(GetForegroundWindow(), 0&)
'获取当前线程标识符
lCurThreadId = GetCurrentThreadId()
'将前台窗口线程连接到当前线程
AttachThreadInput lThread, lCurThreadId, True
'激活窗口
Me.SetFocus
'或'SetActiveWindow Me.hwnd
'释放线程
AttachThreadInput lThread, lCurThreadId, False
End Sub 其它应用:利用它和GetFocus可以获得指定线程的焦点窗口的句柄 方法二
,mouse_event 模拟单击事件
Private Sub Timer1_Timer()
Dim tRect As RECT, lResult As Long, hActive As Long
Me.WindowState = vbNormal
'设置窗口位置
lResult = SetWindowPos(Me.hwnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_SHOWWINDOW + SWP_NOMOVE + SWP_NOSIZE)
'设置光标位置
lResult = GetWindowRect(Me.hwnd, tRect)
SetCursorPos tRect.Left + 30, tRect.Top + 10
'模拟鼠标单击事件
mouse_event MOUSEEVENTF_ABSOLUTE Or MOUSEEVENTF_LEFTDOWN, tRect.Left + 30, tRect.Top + 10, 0, 0
mouse_event MOUSEEVENTF_ABSOLUTE Or MOUSEEVENTF_LEFTUP, tRect.Left + 30, tRect.Top + 10, 0, 0
End Sub |