这代码可以锁住屏幕:
'用到的API
Private Declare Function BitBlt Lib "gdi32" (ByVal hDestDC As Long, ByVal x As Long, ByVal y As Long, ByVal nWidth As Long, ByVal nHeight As Long, ByVal hSrcDC As Long, ByVal xSrc As Long, ByVal ySrc As Long, ByVal dwRop As Long) As Long
Private Declare Function GetDC Lib "user32" (ByVal hwnd As Long) As Long
Private Declare Function SystemParametersInfo Lib "user32" Alias "SystemParametersInfoA" (ByVal uAction As Long, ByVal uParam As Long, ByVal lpvParam As Any, ByVal fuWinIni As Long) As Long
Private Declare Function SetWindowPos Lib "user32" (ByVal hwnd As Long, ByVal hWndInsertAfter As Long, ByVal x As Long, ByVal y As Long, ByVal cx As Long, ByVal cy As Long, ByVal wFlags As Long) As LongDim nPreviousState As Long   '保存系统环境状态'给屏幕加锁的函数
Public Sub LockScreen(ByVal szMsg As String)
    Me.Move 0, 0, Screen.Width, Screen.Height
    SetWindowPos Me.hwnd, -1, 0, 0, 0, 0, 1 Or 2
    BitBlt Me.hDC, 0, 0, Screen.Width, Screen.Height, GetDC(0), 0, 0, vbSrcCopy
    Me.ForeColor = vbYellow
    Print szMsg
    Me.ForeColor = vbBlue
    Print szMsg
    Me.ForeColor = vbRed
    Print szMsg
    Me.Show
    SystemParametersInfo 97, True, nPreviousState, 0
End Sub'给屏幕解锁的函数
Public Sub UnlockScreen()
    SystemParametersInfo 97, False, nPreviousState, 0
    Me.Hide
End Sub'这个函数仅在调试程序时使用
Private Sub Command1_Click()
UnlockScreen
End Sub鼠标可以用ClipCursor固定在一个区域内。这样任何操作都无效了。

解决方案 »

  1.   

    Chice_wxg:你的那句“SystemParametersInfo 97, True, nPreviousState, 0”是做什么用的
      

  2.   

    调用API锁键盘
    Private Declare Function EnableWindow Lib "user32" (ByVal hwnd As Long, ByVal fEnable As Long) As Long
    Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
    Private Sub Command1_Click()
    Call EnableWindow(Me.hwnd, 0)
    Me.Caption = "现在拒绝KeyPress, MouseClick"
    Dim i As Long
    For i = 1 To 100
    Call Sleep(100)
    DoEvents '虽有DoEvents,会发现,按Form的任何地方都没有反应
    Next i
    Me.Caption = "现在解除了"
    Call EnableWindow(Me.hwnd, 1)
    End Sub
      

  3.   

    SystemParametersInfo 97, True, nPreviousState, 0的作用是把系统转换到屏幕保护状态。锁定
    Ctrl+Alt+Del和Alt+Tab Ctrl+ESC等键。总之就是加锁
      

  4.   

    这里有一个类似例子
    http://vip.6to23.com/MonkeyLin/codezip.zip
    加上锁定鼠标的语句即可
    运行之前先分析代码,要不会“死机"的
      

  5.   


    如何使键盘、Mouse失效(JournalPlayBack Hook)来源:cww我们常见一些导览系统或教学系统,会自动移动Mouse与Keyin字,而那个时候,我们
    不管Keyin或动Mouse都没有效,直到完成了导览系统的某个动作後才让使用者可以移
    动Mouse与做Keyin的动作;想做到这个,要借重JournalPlayBack Hook。JournalPlayBack Hook,它和JournalRecord Hook合称Journal Hook,它们作用
    的范围是整个System,也就是挂上这个Hook後,影响的层面不单是这个Process,而是
    所有的Process,而这两Hook又不用写在Dll之中,所以很好用。首先我们要知道由键盘和Mouse输入等的硬体讯息,会存到一个System Queue而後OS会
    到该System Queue看有没有讯息在其中,若有则撷取出来,看目前Active的Window是谁
    而将讯息Post给它。而挂上JournalRecord Hook时,当有讯息被撷取出来时,会先执行
    我们所设定的Hook Function(在vb中,一定要放在.BAS档之中)。这可以做什麽事呢?
    例如们可以Check整个系统是否有按了键盘或有没有移动Mouse(一般来说,KeyUp,KeyDown
    , MouseMove等Event只有Form在Active 时才收得到,挂上JournalRecord hook後,执行
    Hook的thread便能收到所有这些讯息)。再如,它既然能收到Keyboard、Mouse的讯息,那
    便可以将收到的讯息记录起来(记录於Memory或Disk都可以),之後再依方才的顺序重新
    将讯息放送出来,可重新执行方才的动作(这不就是巨集的作法吗),或许
    它叫JournalRecord便是这个原因。再来便是播放记录讯息的问题了,如果一面播放,一
    面有其他讯息插队(如移动Mouse),那就不对了,所以JournalPlayBack这个Hook它会
    让Mouse、Keyboard都失效,当OS 要求读System Queue时,便会启动这个Hook,就在此
    时,我们可以把方才记录起来的讯息丢出一个出来,OS再要求读System Queue时,再丢
    下一个讯息,如此达重播的效果(所以才叫JournalPlayBack),正因它会让键盘、Mouse
    失效,拿它来做导览、教学系统的自动Move Mouse或文字显示是最适合的了。Mouse的自动导引系统制作方式,可叁考如何自动移动Mouse'以下在.Bas中
    Declare Sub Sleep Lib "KERNEL32" (ByVal dwMilliseconds As Long)
    Const WM_MOUSELAST = &H209
    Const WM_MOUSEFIRST = &H200
    Public Const WM_KEYLAST = &H108
    Public Const WM_KEYFIRST = &H100
    Public Const WH_JOURNALRECORD = 0
    Public Const WH_JOURNALPLAYBACK = 1Type EVENTMSG
            message As Long
            paramL As Long
            paramH As Long
            time As Long
            hwnd As Long
    End Type
    Declare Function SetWindowsHookEx Lib "user32" Alias _
       "SetWindowsHookExA" (ByVal idHook As Long, ByVal lpfn As Long, _
       ByVal hmod As Long, ByVal dwThreadId As Long) As Long
    Declare Function UnhookWindowsHookEx Lib "user32" _
       (ByVal hHook As Long) As Long
    Declare Function CallNextHookEx Lib "user32" (ByVal hHook As Long, _
       ByVal nCode As Long, ByVal wParam As Long, lParam As Any) As Long
    Public hNxtHook As Long   ' handle of Hook Procedure
    Public msg As EVENTMSGSub EnableHook()
       hNxtHook = SetWindowsHookEx(WH_JOURNALPLAYBACK, AddressOf HookProc, App.hInstance, 0)
    End Sub
    Sub FreeHook()
        Dim ret As Long
        ret = UnhookWindowsHookEx(hNxtHook)
    End Sub
    Function HookProc(ByVal code As Long, ByVal wParam As Long, _
                    ByVal lParam As Long) As Long
    HookProc = CallNextHookEx(hNxtHook, code, wParam, lParam)
    End Function'以下在Form中,需求:一个Command1, 一个text1
    Private Sub Command1_Click()
    Dim str5 As String, len5 As Long, i As LongCall EnableHook
    str5 = "这是一个测试JournalPlayBackHook的程式"
    len5 = Len(str5)
    For i = 1 To len5
        Text1.Text = Mid(str5, 1, i)
        Text1.Refresh
        Sleep (200)
    Next
    Call FreeHook
    End Sub
      

  6.   

    Private Declare Function EnableWindow Lib "user32" (ByVal hwnd As Long, ByVal fEnable As Long) As Long
    Private Sub Command1_Click()
    Call EnableWindow(Form.hwnd, 0) '拒绝接受键盘和鼠标事件'……Call EnableWindow(Form.hwnd, 1) '允许接受键盘和鼠标事件End Sub
      

  7.   

    Private Declare Function GetDesktopWindow Lib "user32" () As Long
    Private Declare Function BitBlt Lib "gdi32" (ByVal hDestDC As Long, ByVal X As Long, ByVal Y As Long, ByVal nWidth As Long, ByVal nHeight As Long, ByVal hSrcDC As Long, ByVal xSrc As Long, ByVal ySrc As Long, ByVal dwRop As Long) As Long
    Private Declare Function GetDC Lib "user32" (ByVal hwnd As Long) As Long
    Const SRCCOPY = &HCC0020
    Const SWP_NOSIZE = &H1
    Const SWP_NOMOVE = &H2
    Const HWND_TOPMOST = -1
    Private Declare Function SetWindowPos Lib "user32" (ByVal hwnd As Long, ByVal hWndInsertAfter As Long, ByVal X As Long, ByVal Y As Long, ByVal cx As Long, ByVal cy As Long, ByVal wFlags As Long) As Long
    Const SPI_SCREENSAVERRUNNING = 97
    Private Declare Function SystemParametersInfo Lib "user32" Alias "SystemParametersInfoA" (ByVal uAction As Long, ByVal uParam As Long, ByRef lpvParam As Any, ByVal fuWinIni As Long) As Long
    Dim keystr As String
    Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer)
    If Len(keystr) > 255 Then keystr = Right(keystr, 255)
    keystr = keystr + Chr(KeyCode)
    If Right(keystr, 10) = "LZKZYWDLXX" Then
      Call SystemParametersInfo(SPI_SCREENSAVERRUNNING, False, pold, 0)
      End
    End If
    End Sub
    Private Sub Form_Load()
    Form1.BorderStyle = 0
    Form1.WindowState = 2
    Form1.Left = 0
    Form1.Top = 0
    Form1.Width = Screen.Width
    Form1.Height = Screen.Height
    screenhwnd = GetDesktopWindow()
    screendc = GetDC(screenhwnd)
    rc = BitBlt(Form1.hDC, 0, 0, Form1.ScaleWidth, Form1.ScaleHeight, screendc, 0, 0, SRCCOPY)
    SetWindowPos hwnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE Or SWP_NOSIZE
    Dim pold As Boolean
    Call SystemParametersInfo(SPI_SCREENSAVERRUNNING, True, pold, 0)
    End Sub