You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

适配64位与32位Access的User32函数兼容方案问询

兼容32位与64位Office的Access窗口关闭按钮禁用代码

原代码仅适配32位Office,64位环境下因API声明不兼容导致无法识别,以下是重写后的兼容版本:

#If VBA7 Then
    Private Declare PtrSafe Function GetSystemMenu Lib "user32" (ByVal hWnd As LongPtr, _
        ByVal bRevert As Long) As LongPtr

    Private Declare PtrSafe Function EnableMenuItem Lib "user32" (ByVal hMenu As _
        LongPtr, ByVal wIDEnableItem As Long, ByVal wEnable As Long) As Long
#Else
    Private Declare Function GetSystemMenu Lib "user32" (ByVal hWnd As Long, _
        ByVal bRevert As Long) As Long

    Private Declare Function EnableMenuItem Lib "user32" (ByVal hMenu As _
        Long, ByVal wIDEnableItem As Long, ByVal wEnable As Long) As Long
#End If

Const MF_GRAYED = &H1&
Const MF_BYCOMMAND = &H0&
Const SC_CLOSE = &HF060&

Public Function SetEnabledState(blnState As Boolean)
    Call CloseButtonState(blnState)
End Function

'禁用/启用窗口关闭按钮
Sub CloseButtonState(boolClose As Boolean)
    Dim hWnd As LongPtr
    Dim wFlags As Long
    Dim hMenu As LongPtr
    Dim result As Long
      
    hWnd = Application.hWndAccessApp
    hMenu = GetSystemMenu(hWnd, 0)
    If Not boolClose Then
        wFlags = MF_BYCOMMAND Or MF_GRAYED
    Else
        wFlags = MF_BYCOMMAND And Not MF_GRAYED
    End If
   
    result = EnableMenuItem(hMenu, SC_CLOSE, wFlags)
End Sub

关键修改说明

  • 条件编译适配:用#If VBA7 Then判断Office版本,VBA7对应Office 2010及以后的32/64位版本,自动加载带PtrSafe的API声明;旧版本则沿用原32位声明
  • 句柄类型替换:将Long类型的句柄变量(hWnd、hMenu)改为LongPtr,该类型会根据系统位数自动适配32位(4字节)或64位(8字节),确保句柄在64位环境下有效
  • API声明添加PtrSafe:64位Office要求所有外部API声明必须包含PtrSafe关键字,否则会抛出“找不到库”的错误
  • 功能逻辑保留:原有的禁用/启用逻辑完全不变,确保功能和之前一致

内容的提问来源于stack exchange,提问作者LeasMaps

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 04:05:09