Access 2013调用Word拼写检查后窗口无法自动激活问题求助
解决Access调用Word拼写检查后无法自动回到前台的问题
问题分析
原代码里的AppActivate和SetForegroundWindow无法让Access自动回到前台,核心原因是Windows的前台窗口激活权限限制——只有当前持有输入焦点的线程才能激活其他窗口,Word退出后的线程残留状态会导致Access线程无法直接获取激活权限。
解决方案
需要补充API函数绕过激活限制,同时调整激活逻辑的顺序:
- 在标准模块中添加以下API声明(无标准模块则新建一个):
Declare Function SetForegroundWindow Lib "user32" (ByVal hwnd As Long) As Long Declare Function GetWindowThreadProcessId Lib "user32" (ByVal hwnd As Long, lpdwProcessId As Long) As Long Declare Function AttachThreadInput Lib "user32" (ByVal idAttach As Long, ByVal idAttachTo As Long, ByVal fAttach As Long) As Long Declare Function GetForegroundWindow Lib "user32" () As Long
- 修改按钮点击事件代码:
Private Sub Comando2_Click() Dim objWord As Word.Application Dim doc As Word.Document Dim accesshwnd As Long Dim currentThreadId As Long Dim foregroundThreadId As Long accesshwnd = Application.hWndAccessApp Set objWord = CreateObject("Word.Application") With objWord Set doc = .Documents.Add .Selection.Text = Me.Texto0 .Visible = True .Dialogs(wdDialogToolsSpellingAndGrammar).Show If Len(.Selection.Text) <> 1 Then Me.Texto0 = .Selection.Text End If doc.Close wdDoNotSaveChanges .Quit End With Set objWord = Nothing ' 获取当前Access线程ID和前台窗口线程ID currentThreadId = GetWindowThreadProcessId(accesshwnd, 0) foregroundThreadId = GetWindowThreadProcessId(GetForegroundWindow(), 0) ' 绑定线程输入,获取激活权限 AttachThreadInput foregroundThreadId, currentThreadId, True ' 激活Access窗口 SetForegroundWindow accesshwnd ' 取消线程绑定 AttachThreadInput foregroundThreadId, currentThreadId, False End Sub
关键修改说明
- 移除无效的
AppActivate和GetCurrentProcessId:原代码用进程ID激活窗口的方式不可靠,换成窗口句柄结合API的方案。 AttachThreadInput函数:将Access线程与当前前台窗口线程绑定,让Access线程获得激活窗口的权限,这是绕过Windows激活限制的核心操作。- 清理冗余代码:删掉不必要的
VBA.AppActivate (docum)和.Visible = False,避免干扰窗口状态。
内容的提问来源于stack exchange,提问作者Luisja
相关产品推荐
相关产品推荐

