适配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
相关产品推荐
相关产品推荐

