Office中国论坛/Access中国论坛

标题: [原创] 激活后台程序的窗口 [打印本页]

作者: topses    时间: 2010-12-8 22:57
标题: [原创] 激活后台程序的窗口
激活后台程序的窗口
V1.1

最后修订:2010-3-14    By:Topses
如何激活后台程序的窗口,使其成为前台窗口,这个问题看似简单,对于新手来说却有一些麻烦
我们开始时肯定都会用(SetWindowPosSwitchToThisWindowBringWindowToTopSetForegroundWindow)这几个函数来进行操作,这些函数对一个特定的输入线程来说是“本地的”——换言之,倘若某窗口并非前台应用程序的一部分,那么一旦随同该窗口调用本函数,仍会将窗口带至它自己那个应用程序的窗口列表顶部。但是,不会同时使那个应用成为前台应用程序。这意味着在调用了本函数后,窗口仍会保持隐藏状态。
就是说,如果在自己的进程内调用时可以的,如果想激活其他的进程的窗口就不行了(程序只是在任务栏里闪动),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

作者: topses    时间: 2010-12-8 23:10
本帖最后由 topses 于 2010-12-8 23:12 编辑

[attach]44330[/attach]
发现有一个错误: 因为在调试时VBE与调试的程序是在一个进程当中。
而不是同一个线程中

代码是VB写的,直接拷贝至VBA同样运行
[attach]44331[/attach]



作者: topses    时间: 2010-12-8 23:28
看到很多人的登录窗口都错误的使用 SetWindowPos,SwitchToThisWindow,BringWindowToTop,SetForegroundWindow
这几个函数使其登录窗口设为顶级, 但真正编译后, 双击打开MDE, 由于不在同一进程内, 登录窗口却不为激活状态,
特发此贴明正.
作者: wanshan    时间: 2010-12-9 10:12
谢谢!
还要用到计时器吗?
有没有access的实例?




欢迎光临 Office中国论坛/Access中国论坛 (http://www.office-cn.net/) Powered by Discuz! X3.3