Office中国论坛/Access中国论坛
标题: [原创] 激活后台程序的窗口 [打印本页]
作者: topses 时间: 2010-12-8 22:57
标题: [原创] 激活后台程序的窗口
激活后台程序的窗口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
作者: 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 |