想让VB程序一运行后,就禁用打印屏幕键,请问怎么做?

解决方案 »

  1.   

    用全局键盘钩子或低级键盘钩子实现(前者需要用vc编1个dll,后者不需要,不过受操作系统的限制)
      

  2.   

    试试看看是不是你要的:'窗体:
    Option Explicit
    Private Sub Form_Load()
        Call Hook
    End SubPrivate Sub Form_Unload(Cancel As Integer)
        Call ReleaseHook
    End Sub
    '在模块中:
    Option ExplicitPrivate Declare Function CallNextHookEx Lib "user32" (ByVal hHook As Long, ByVal ncode As Long, ByVal wParam As Long, lParam As Any) As Long
    Private 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
    Private Declare Function UnhookWindowsHookEx Lib "user32" (ByVal hHook As Long) As Long
    Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long)
    Private Type PKBDLLHOOKSTRUCT
        VKCode As Long
        scanCode As Long
        flags As Long
        time As Long
        dwExtraInfo As Long
    End Type
    Private Const WH_KEYBOARD_LL = 13
    Private Const HC_ACTION = 0
    Private Const WM_KEYDOWN = &H100
    Private Const VK_SNAPSHOT = &H2C
    Private PrevHook As LongPublic Function LowLevelKeyboardProc(ByVal ncode As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
            
        If ncode = HC_ACTION Then
            If wParam = WM_KEYDOWN Then
            
                Dim p As PKBDLLHOOKSTRUCT
                CopyMemory p, ByVal lParam, Len(p)
                
                If p.VKCode = VK_SNAPSHOT Then
                    LowLevelKeyboardProc = -1
                    Exit Function
                End If        End If
        End If
        
        CallNextHookEx WH_KEYBOARD_LL, ncode, wParam, lParam
    End FunctionPublic Sub Hook()
        PrevHook = SetWindowsHookEx(WH_KEYBOARD_LL, AddressOf LowLevelKeyboardProc, App.hInstance, 0)
    End SubPublic Sub ReleaseHook()
        Call UnhookWindowsHookEx(PrevHook)
    End Sub
      

  3.   

    上面的代码运行时提示: Addressof 使用无效,请教怎么处理?谢谢。
      

  4.   

    先得到PrintScreen键的键值。然后调用API就可以啦
      

  5.   

    添加一个标准模块,把'在模块中:
    Option Explicit
    .....
    Public Sub ReleaseHook()
        Call UnhookWindowsHookEx(PrevHook)
    End Sub这段代码粘到模块里去,不能放在窗体模块里
      

  6.   

    将p.VKCode = VK_SNAPSHOT 中的VK_SNAPSHOT 改为你需要的即可PS:这是低级键盘钩子,要搞懂它,建议好好看看msdn
      

  7.   

    处理其他键(比如Tab,Up,Right,Down,Left等):......
    Private Const VK_TAB = &H9
    Private Const VK_UP = &H26
    Private Const VK_RIGHT = &H27
    Private Const VK_DOWN = &H28
    Private Const VK_LEFT = &H25
    ......
    Public Function LowLevelKeyboardProc(ByVal ncode As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
            
        If ncode = HC_ACTION Then
            If wParam = WM_KEYDOWN Then
            
                Dim p As PKBDLLHOOKSTRUCT
                CopyMemory p, ByVal lParam, Len(p)
                
                Select Case p.VKCode
                Case VK_SNAPSHOT
                    LowLevelKeyboardProc = -1
                    Exit Function
                Case VK_TAB
                    MsgBox "处理TAB键!"
                Case VK_UP
                    MsgBox "处理UP键!"
                Case VK_RIGHT
                    MsgBox "处理Right键!"
                Case VK_DOWN
                    MsgBox "处理Down键!"
                Case VK_LEFT
                    MsgBox "处理Left键!"
                Case Else
                    CallNextHookEx WH_KEYBOARD_LL, ncode, wParam, lParam
                End Select        End If
        End If
        
    End Function
    ......
      

  8.   

    请教 faysky2(出来混,迟早是要还嘀):为何我加了那个模块,运行还是提示 操作符AddressOf使用无效?
      

  9.   

    窗体上的代码只有这些(其他的放到模块里去哦):'窗体:
    Option Explicit
    Private Sub Form_Load()
        Call Hook
    End SubPrivate Sub Form_Unload(Cancel As Integer)
        Call ReleaseHook
    End Sub