如何取消(禁止)Autoexec宏的自动运行?

2024-06-22 11:43:50阅读量:44 字体:

使用Autoexec宏来自动操作一个或多个ACCESS数据库,特别是如果开发者试图获Access对象模型(Access Object Model),胜过使用Jet引擎(能通过DAO和ADO来获取的)。不管怎样,Access不提供任何内置的方法来有条件避开这个Autoexec宏。如果数据库包括了这个宏,一打开就会运行。当未设置数据库的AllowBypassKey属性时,可以在启动数据库时按住Shift键来避开运行这个宏。

如果没有设置AllowBypassKey属性,那么可以通过编程方式模拟启动数据库时按住Shift键,这样可以自动避开数据库启动的自动代码。通过引用隐藏的ACCESS数据库实例来避开数据库的自动宏,你可以使用下面的函数fGetRefNoAutoexec。

’********* Code Start ***********
’ This code was originally written by Dev Ashish.
’ It is not to be altered or distributed,
’ except as part of an application.
’ You are free to use it in any application,
’ provided the copyright notice is left unchanged.

’ Code Courtesy of
’ Dev Ashish


Private Declare Function SetKeyboardState _
Lib "user32" _
(lppbKeyState As Any) _
As Long

Private Declare Function GetKeyboardState _
Lib "user32" (pbKeyState As Any) _
As Long

Private Declare Function GetWindowThreadProcessId _
Lib "user32" _
(ByVal hWnd As Long, _
lpdwProcessId As Long) _
As Long

Private Declare Function AttachThreadInput _
Lib "user32" _
(ByVal idAttach As Long, _
ByVal idAttachTo As Long, _
ByVal fAttach As Long) _
As Long

Private Declare Function SetForegroundWindow _
Lib "user32" _
(ByVal hWnd As Long) _
As Long

Private Declare Function SetFocusAPI _
Lib "user32" Alias "SetFocus" _
(ByVal hWnd As Long) _
As Long

Private Const VK_SHIFT = &H10
Private Const VK_LSHIFT = &HA0
Private Const VK_RSHIFT = &HA1

Function fGetRefNoAutoexec( _
ByVal strMDBPath As String) _
As Access.Application
On Error GoTo ErrHandler
Dim objAcc As Access.Application
Dim TIdSrc As Long, TIdDest As Long
Dim abytCodesSrc(0 To 255) As Byte
Dim abytCodesDest(0 To 255) As Byte

If (Len(Dir$(strMDBPath, vbNormal)) = 0) Then
Err.Raise 53
End If

Set objAcc = New Access.Application
With objAcc
.Visible = True

’ attach to process
TIdSrc = GetWindowThreadProcessId( _
Application.hWndAccessApp, ByVal 0)
TIdDest = GetWindowThreadProcessId( _
.hWndAccessApp, ByVal 0)

If CBool(AttachThreadInput(TIdSrc, TIdDest, True)) Then
Call SetForegroundWindow(.hWndAccessApp)
Call SetFocusAPI(.hWndAccessApp)

’ 设置Shift状态
Call GetKeyboardState(abytCodesSrc(0))
Call GetKeyboardState(abytCodesDest(0))
abytCodesDest(VK_SHIFT) = 128
Call SetKeyboardState(abytCodesDest(0))

’ 打开一个带有Autoexec宏的mdb
Call .OpenCurrentDatabase(strMDBPath, False)

’ 恢复键盘状态
Call SetKeyboardState(abytCodesSrc(0))
End If
’ release
Call AttachThreadInput(TIdSrc, TIdDest, False)
Call SetForegroundWindow(Application.hWndAccessApp)
Call SetFocusAPI(Application.hWndAccessApp)

End With
Set fGetRefNoAutoexec = objAcc
Set objAcc = Nothing

Exit Function
ErrHandler:
If (TIdDest) Then Call AttachThreadInput(TIdSrc, TIdDest, False)
Call SetForegroundWindow(Application.hWndAccessApp)
With Err
.Raise .Number, .Source, .Description, .HelpFile, .HelpContext
End With
End Function
’********* Code End ***********

以上就是如何取消(禁止)Autoexec宏的自动运行?的全部内容,望能这篇如何取消(禁止)Autoexec宏的自动运行?可以帮助您解决问题,能够解决大家的实际问题是谜爱阁生活网一直努力的方向和目标。

推荐阅读

  • 支付宝悄悄话怎么知道对方看没看

    支付宝悄悄话怎么知道对方看没看

    支付宝的悄悄话是阅后即焚的消息,如果发送悄悄话过去,悄悄话消失了就证明对方已看。具体操作方法如下: 支付宝悄悄话怎么知道对方看没看 1、打开手机支付宝app,点击消息”,再点击右上角人像。...

    阅读: 1655

  • 健康码代领怎么弄

    健康码代领怎么弄

    在家里的老人孩子都不会操作手机的时候,可以代领健康码,在微信的防疫健康码中即可进行代领。具体操作方法如下: 健康码代领怎么弄 1、打开手机微信app,点击我”。 2、点击服务&rdquo...

    阅读: 863

  • 倒数日怎么删除不用的事件

    倒数日怎么删除不用的事件

    倒数日是一款倒计时软件,添加的事件可以进行删除,进入事件编辑即可删除。具体操作方法如下: 倒数日怎么删除不用的事件 1、打开手机倒数日app,点击需要删除的事件,进入事件页面。 2、点击右上角笔的标...

    阅读: 819

  • 怎么关闭零钱通

    怎么关闭零钱通

    零钱通是微信中的一个理财产品,如果需要关闭,在零钱通的设置中直接关闭即可。具体操作方法如下: 怎么关闭零钱通 1、打开手机微信app,点击我”。 2、点击服务”。 3、点击...

    阅读: 850

  • qq听歌状态怎么显示听的歌

    qq听歌状态怎么显示听的歌

    qq听歌状态可以显示正在QQ音乐听的歌,设置听歌状态后进入QQ音乐听歌即可。具体操作方法如下: qq听歌状态怎么显示听的歌 1、打开手机QQ软件,点击头像上的状态,进入状态设置。 2、找到并点击听歌...

    阅读: 925

  • qq相册怎么转移到另一个qq

    qq相册怎么转移到另一个qq

    qq相册要转移到另一个qq,可以借助转载功能进行转移,使用QQ进入另一个QQ的相册即可进行转载。具体操作方法如下: qq相册怎么转移到另一个qq 1、打开手机QQ软件,点击联系人”,再点击...

    阅读: 864