2013-12-16 67 views
0
Option Compare Database  

Dim pUser As String 

Private Sub signinCmd_Click()  
Dim db As Database 
Dim rst As Recordset 

Set db = CurrentDb 

Dim idEntered As String 
Dim pwEntered As String 

idEntered = Me.idBox & "" 
pwEntered = Me.pwBox & "" 

pUser = idEntered 

Set rst = db.OpenRecordset ("SELECT * " & vbCrLf & _ 
    "From userInfo " & vbCrLf & "WHERE [ID] = '" Me.idBox & "'") 

    If pwEntered = rst.Fields("Password") & "" Then 
     Call getPermission(idEntered) 
    Else 
     MsgBox "You typed the wrong password. Try Again.", vbExclamation, "Security" 
    End If 
End Sub 





Sub getPermission(pStr As String) 
    Select Case pStr 
    Case "Guest" 
     SetEnabledState(False) 
     DoCmd.LockNavigationPane(True) 
     DoCmd.Close 
     DoCmd.OpenForm "Startup", acNormal, , , , acDialog 
    Case "Manager" 
     DoCmd.LockNavigationPane(True) 
     DoCmd.Close 
     DoCmd.OpenForm "Startup", acNormal, , , , acDialog 
    Case "Administrator" 
     DoCmd.Close 
     DoCmd.OpenForm "Startup", acNormal, , , , acDialog 
End Select 
End Sub 




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 

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

Public Function SetEnabledState(bInState As Boolean) 
    Call CloseButtonState(bInState) 
    Call ExitMenuState(bInState) 
End Function 

Sub ExitMenuState(bInExitState As Boolean) 
    Application.CommandBars("File").Controls("Exit").Enabled = bInExitState 
End Sub 

Sub CloseButtonState(boolClose As Boolean) 
    Dim hwnd As Long 
    Dim wFlags As Long 
    Dim hMenu As Long 
    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 

我试图在“guest”已经登录时禁用对话框的关闭按钮,但是当我运行此代码时,不是关闭按钮,而是禁用了MS Access的关闭按钮。我如何以代码方式解决这个问题? (SetEnabledState Function决定使用其布尔参数禁用或启用关闭按钮。)如何禁用MS Access中对话框的关闭按钮?

+0

哪个对话框?顺便说一句,你知道这条线'hwnd = Application.hWndAccessApp'吗? –

+0

我的意思是getPermission函数出现的对话框。 (DoCmd.OpenForm“Startup”,acNormal,,,,acDialog) –

+0

实际上,我不太清楚hwnd = Application.hWndAccessApp的功能。 @SiddharthRout –

回答

0

这是一个令人讨厌的工作你也必须使窗体弹出或模态,因为这将不适用于acDialog无论如何,我不确定你需要一个对话框。

模态=保持焦点,直到关闭

弹出=仍然在上面但直到关闭

对话框不需要聚焦=暂停在当前Sub或功能进一步代码,直到表格关闭,然后恢复。

由于您使用的是对话框,因此您实际上不必要地停止了case语句中间的代码,即使表单关闭后确实没有执行。

Sub getPermission(pStr As String) 
    Select Case pStr 
    Case "Guest" 
     DoCmd.LockNavigationPane(True) 
     DoCmd.Close 
     SetEnabledStateAndOpen "Startup", False 
    Case "Manager" 
     DoCmd.LockNavigationPane(True) 
     DoCmd.Close 
     DoCmd.OpenForm "Startup", acNormal, , , , acDialog 
    Case "Administrator" 
     DoCmd.Close 
     DoCmd.OpenForm "Startup", acNormal, , , , acDialog 
    End Select 
End Sub 


Sub SetEnabledStateAndOpen(frm As String,closeState As Boolean) 
    'Change Close Button at runtime by opening in design view altering closebutton and then switching views 
     DoCmd.OpenForm frm, acDesign 
     Forms(frm).CloseButton = closeState 
     Forms(frm).SetFocus 
     DoCmd.RunCommand acCmdFormView 
End Sub 

附注

不知道这个应用程序是什么,但查询是非常注射尝试输入' OR 'a' = 'aMe.idBox看看会发生什么监守它会生成一个查询看起来像这样SELECT * From userInfo WHERE [ID] = '' OR 'a' = 'a'它会返回userInfo表中的所有记录可能由于密码检查而没有很大的影响,但是当此查询返回0结果时,您将遇到类似于Administrator' AND 'a' = 'b的问题生成

SELECT * From userInfo WHERE [ID] = 'Administrator' AND 'a' = 'b'它变成

If "" = "" Then 
    Call getPermission('Administrator') 
Else 
    MsgBox "You typed the wrong password. Try Again.", vbExclamation, "Security" 
End If 

如果没有抛出无效使用空的错误