捕获访问-应用程序窗口恢复/最大化事件

Posted

技术标签:

【中文标题】捕获访问-应用程序窗口恢复/最大化事件【英文标题】:Capture Access-Application Window Restore/Maximize Event 【发布时间】:2010-10-26 13:31:01 【问题描述】:

场景:在 Access 项目中,必须根据 Access-Application 窗口的大小来定位和重新排列主窗体。这应该使用 VBA 完成。

据我所知,Microsoft Access VBA 无法捕获 Access-Application 窗口的恢复/最大化事件(我指的是 Access Window 本身,而不是其中的任何形式)。

有没有办法使用 WIN32 API 解决这个问题?

【问题讨论】:

呃,你看过 OnResize 事件了吗? 不幸的是,Access-Application 窗口没有 OnResize 事件。您可以参考表单事件。 如果您最大化所有表单,它们将保留在 Access 应用程序窗口中,您无需担心调整它们的大小。但我不喜欢他们的外表或行为方式。基本上,我永远不会担心你关心什么,因为没有好的方法让它按照你想要的方式运行。它不是 Access 原生的,所以你做的任何事情都是杂乱无章的。放松并以 Access 方式做事,你的白发就会少很多。 【参考方案1】:

我不知道有什么方法可以使用 WIN32 API 来捕获恢复/最大化事件。我能想到的最佳解决方法是将 Win32 API 与始终打开的窗体(主菜单或某些隐藏窗体)的 Timer 事件结合使用,并定期轮询主访问窗口以确定它当前是否已最大化。

Enum WindowSize
    wsMax = 1
    wsMin
    wsRestore
End Enum

'Functions return 1 for true and 0 for false; multiply result by -1 to use as Boolean'
Private Declare Function IsZoomed Lib "User32" (ByVal hWnd As Long) As Integer
Private Declare Function IsIconic Lib "User32" (ByVal hWnd As Long) As Integer

Function IsMaximized(hWnd As Long) As Boolean
    IsMaximized = IsZoomed(hWnd) * -1
End Function

Function IsMinimized(hWnd As Long) As Boolean
    IsMinimized = IsIconic(hWnd) * -1
End Function

Private Sub Form_Timer()
Static PrevWinSize As WindowSize

    If IsMaximized(hWndAccessApp) Then
        If PrevWinSize <> wsMax Then
            'Window has been maximized since we last checked'
            MsgBox "Main Access window is maximized"
            PrevWinSize = wsMax
        End If
    ElseIf IsMinimized(hWndAccessApp) Then
        If PrevWinSize <> wsMin Then
            'Window has been minimized since we last checked'
            MsgBox "Main Access window is minimized"
            PrevWinSize = wsMin
        End If
    Else
        If PrevWinSize <> wsRestore Then
            'Window has been restored since we last checked'
            MsgBox "Main Access window is restored"
            PrevWinSize = wsRestore
        End If
    End If

End Sub

您需要在表单的 TimerInterval 属性中设置一个时间间隔,以控制您需要多长时间轮询一次窗口大小。

编辑:显然,您需要跟踪主窗口的先前状态,以免进行任何不必要的处理。发布的代码反映了这一点。

【讨论】:

以上是关于捕获访问-应用程序窗口恢复/最大化事件的主要内容,如果未能解决你的问题,请参考以下文章

Electron 应用程序窗口在最小化、最大化和关闭事件时仍然有动画

无法捕获 Lync 对话窗口的“NeedsSize”更改事件

WPF 弹出窗口捕获鼠标双击事件

MFC CMFCToolBar 最小化恢复工具栏显示异常

如何在 Emscripten + SDL 中禁用窗口事件捕获?

node webkit- 从父窗口捕获 iframe 鼠标事件