Pfeiltasten in MS Access Sperren

  • Hi all,

    wenn man MS Access öffnet, kommt zuerst die "Sicherheitswarnung". In dieser möchte ich die Pfeiltasten sperren.

    Grund ist folgender:

    Ich habe eine Routine erstellt, die beim Drücken der Shift-Taste die Controls deaktiviert und diese solange nicht mehr anklickbar sind, bis Shift losgelassen wird.
    Das Problem ist aber, wenn man Shift gedrückt hält und dann mit den Pfeiltasten navigiert, kommt man trotzdem zum Ziel...

    Mit folgendem funktioniert dies aber leider nicht (dafür aber überall sonst!):

    Spoiler anzeigen
    [autoit]


    HotKeySet("{right}", "go")

    [/autoit] [autoit][/autoit] [autoit]

    func go()
    sleep(1)
    EndFunc

    [/autoit]

    Edit: Der bisherige Code:

    Spoiler anzeigen
    [autoit]


    #NoTrayIcon
    #include <misc.au3>

    [/autoit] [autoit][/autoit] [autoit]

    dim $enabled = 1, $time = TimerInit()

    [/autoit] [autoit][/autoit] [autoit]

    HotKeySet("^!d","disable")

    [/autoit] [autoit][/autoit] [autoit]

    while 1

    [/autoit] [autoit][/autoit] [autoit]

    if WinExists("Sicherheitswarnung") and $enabled Then

    [/autoit] [autoit][/autoit] [autoit]

    if _IsPressed(10) Then
    WinSetState("Sicherheitswarnung","",@SW_DISABLE)
    Else
    WinSetState("Sicherheitswarnung","",@SW_ENABLE)
    EndIf
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    if TimerDiff($time) > 10000 Then
    $enabled = 1
    $time = TimerInit()
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    sleep(1)
    WEnd

    [/autoit] [autoit][/autoit] [autoit]

    func disable()
    $enabled = 0
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    HotKeySet("{right}", "go")

    [/autoit] [autoit][/autoit] [autoit]

    func go()
    sleep(1)
    EndFunc

    [/autoit]

    ...lässt sich für ca 10 Sekunden per Strg+Alt+D deaktivieren.

    Funktioniert soweit auch perfekt, Mausklicks sind nicht mehr möglich, nur leider die Pfeiltasten noch.

    Danke und Grüße
    x0r

    Simon nörgelt, Simon nervt - aber Simon verbessert die Welt. Glaubt er.

    2 Mal editiert, zuletzt von x0r (1. März 2012 um 11:06)

  • Also wenn du wirklich nur die Pfeiltasten sperren möchtest, kannst du dir ja mal folgendes anschaun:

    Spoiler anzeigen
    [autoit]

    #include <WindowsConstants.au3>
    #include <WinAPI.au3>

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    OnAutoItExitRegister("__Exit")

    [/autoit] [autoit][/autoit] [autoit]

    Global $pStub_KeyProc = DllCallbackRegister("_KeyProc", "int", "int;ptr;ptr")
    Global $hHookKeyboard = _WinAPI_SetWindowsHookEx($WH_KEYBOARD_LL, DllCallbackGetPtr($pStub_KeyProc), _WinAPI_GetModuleHandle(0), 0)

    [/autoit] [autoit][/autoit] [autoit]

    While 1
    Sleep(10)
    WEnd

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Func _KeyProc($nCode, $wParam, $lParam) ;CALLBACK FUNC
    If $nCode < 0 Then Return _WinAPI_CallNextHookEx($hHookKeyboard, $nCode, $wParam, $lParam)
    Local $tKEYHOOKS = DllStructCreate($tagKBDLLHOOKSTRUCT, $lParam)
    Local $vkCode = DllStructGetData($tKEYHOOKS, "vkCode")
    If $wParam = $WM_KEYDOWN And _BadKey($vkCode) Then
    DllCall('user32.dll', 'int', 'keybd_event', 'int', 0x0, 'int', 0, 'int', 0, 'ptr', 0)
    Return -1
    EndIf
    Return _WinAPI_CallNextHookEx($hHookKeyboard, $nCode, $wParam, $lParam)
    EndFunc ;==>_KeyProc

    [/autoit] [autoit][/autoit] [autoit]

    Func _BadKey($vkCode)
    If ($vkCode = 0x25) Or ($vkCode = 0x26) Or ($vkCode = 0x27) Or ($vkCode = 0x28) Then
    Return True
    Else
    Return False
    EndIf
    EndFunc ;==>_BadKey

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Func __Exit()
    DllCallbackFree($pStub_KeyProc)
    _WinAPI_UnhookWindowsHookEx($hHookKeyboard)
    EndFunc ;==>__Exit

    [/autoit]


    Vielleicht ein bisschen umständlich...

    • Offizieller Beitrag

    x0r, dein HotKeySet steht einfach an der falschen Stelle im Script.
    Dein HotKeyset wird erst nach velassen der While Wend Schleife ausgeführt und dann ist das Script beendet.

    Edit: Dein Scipt hat auch keinerlei Abbruchbedingungen für deine Hauptschleife, ergo wird dein HotKeySet niemals ausgeführt.

  • K4z: THX!! Ich werds morgen mal testen :)

    Raupi : ich hatte das HotKeySet auch schon oben drin stehen, vor der While-Schleife (glaub ich hatte es in aller Eile nur nochmal drunter kopiert).
    Wie gesagt, die Pfeiltasten waren auch gesperrt, nur eben nicht in diesem "Sicherheitswarung"-Fenster in Access :(

    Edit: Das besagte Fenster ist auch kein Control, zumindest wird mir per Au3Info nichts dergleichen zurückgegeben. Schade!

    Gruß
    x0r

    Simon nörgelt, Simon nervt - aber Simon verbessert die Welt. Glaubt er.

  • Schönen guten Morgen!

    Habe es gerade getestet, selbes Problem, wie bei meinem Script.

    Die Pfeiltasten sind _überall_ deaktiviert, ausser in diesem "Sicherheitswarnung"-Fenster von Access!

    So ein Mist! ;(

    Gruß
    x0r

    Simon nörgelt, Simon nervt - aber Simon verbessert die Welt. Glaubt er.

  • So,

    die bis jetzt optimalste Lösung wäre folgende:

    Dieses Sicherheits-Fenster wird einfach per ESC beendet und somit die komplette Datenbank, wenn die Shift-Taste in diesem Fenster gedrückt wird.
    Lässt sich für 10 Sekunden deaktivieren, wenn man die "Admin-Tastenkombination" kennt, in dem fall WinTaste+N.

    Dann muss die Datenbank zwar geschlossen und wieder neu geöffnet werden, aber so lernen es die Leute wenigstens 8o

    Spoiler anzeigen
    [autoit]

    #NoTrayIcon
    #Region ;**** Directives created by AutoIt3Wrapper_GUI ****
    #AutoIt3Wrapper_icon=..\stop.ico
    #AutoIt3Wrapper_UseX64=n
    #EndRegion ;**** Directives created by AutoIt3Wrapper_GUI ****

    [/autoit] [autoit][/autoit] [autoit]

    #include <misc.au3>

    [/autoit] [autoit][/autoit] [autoit]

    dim $enabled = 1, $time = TimerInit()

    [/autoit] [autoit][/autoit] [autoit]

    HotKeySet("#n","disable")

    [/autoit] [autoit][/autoit] [autoit]

    while 1
    if WinExists("Sicherheitswarnung") and _IsPressed(10) and $enabled = 1 Then
    send("{esc}")
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    if TimerDiff($time) > 10000 Then
    $enabled = 1
    $time = TimerInit()
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    sleep(1)
    WEnd

    [/autoit] [autoit][/autoit] [autoit]

    func disable()
    $enabled = 0
    EndFunc

    [/autoit]

    Grüße
    x0r

    Simon nörgelt, Simon nervt - aber Simon verbessert die Welt. Glaubt er.