设为首页收藏本站Access中国

Office中国论坛/Access中国论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

返回列表 发新帖
查看: 2942|回复: 3
打印 上一主题 下一主题

[窗体] [原创] 激活后台程序的窗口

[复制链接]
跳转到指定楼层
1#
发表于 2010-12-8 22:57:45 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
激活后台程序的窗口
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
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享分享1 分享淘帖 订阅订阅
2#
 楼主| 发表于 2010-12-8 23:10:49 | 只看该作者
本帖最后由 topses 于 2010-12-8 23:12 编辑


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

代码是VB写的,直接拷贝至VBA同样运行



本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
3#
 楼主| 发表于 2010-12-8 23:28:31 | 只看该作者
看到很多人的登录窗口都错误的使用 SetWindowPos,SwitchToThisWindow,BringWindowToTop,SetForegroundWindow
这几个函数使其登录窗口设为顶级, 但真正编译后, 双击打开MDE, 由于不在同一进程内, 登录窗口却不为激活状态,
特发此贴明正.
4#
发表于 2010-12-9 10:12:31 | 只看该作者
谢谢!
还要用到计时器吗?
有没有access的实例?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|站长邮箱|小黑屋|手机版|Office中国/Access中国 ( 粤ICP备10043721号-1 )  

GMT+8, 2024-11-29 17:28 , Processed in 0.123903 second(s), 29 queries .

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表