用钩子来实现。禁用键盘。不过某些组合健如Ctrl+Alt+Del,Alt+Tab无法屏蔽。'In a module
Public Const WH_KEYBOARD = 2
Public Const VK_SHIFT = &H10
Declare Function CallNextHookEx Lib "user32" (ByVal hHook As Long, ByVal ncode As Long, ByVal wParam As Long, lParam As Any) As Long
Declare Function GetKeyState Lib "user32" (ByVal nVirtKey As Long) As Integer
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
Public hHook As LongPublic Function KeyboardProc(ByVal idHook As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
If idHook < 0 Then
'call the next hook
KeyboardProc = CallNextHookEx(hHook, idHook, wParam, ByVal lParam)
Else
If (GetKeyState(VK_SHIFT) And &HF0000000) Then
'add the code
MsgBox "Shift pressed ..."
End If
Call CallNextHookEx(hHook, idHook, wParam, ByVal lParam)
KeyboardProc = 0
End If
End Function
'In a form
Private Sub Form_Load()
'set a keyboard hook
hHook = SetWindowsHookEx(WH_KEYBOARD, AddressOf KeyboardProc, App.hInstance, App.ThreadID)
End Sub
Private Sub Form_Unload(Cancel As Integer)
'remove the windows-hook
UnhookWindowsHookEx hHook
End Sub
Public Const WH_KEYBOARD = 2
Public Const VK_SHIFT = &H10
Declare Function CallNextHookEx Lib "user32" (ByVal hHook As Long, ByVal ncode As Long, ByVal wParam As Long, lParam As Any) As Long
Declare Function GetKeyState Lib "user32" (ByVal nVirtKey As Long) As Integer
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
Public hHook As LongPublic Function KeyboardProc(ByVal idHook As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
If idHook < 0 Then
'call the next hook
KeyboardProc = CallNextHookEx(hHook, idHook, wParam, ByVal lParam)
Else
If (GetKeyState(VK_SHIFT) And &HF0000000) Then
'add the code
MsgBox "Shift pressed ..."
End If
Call CallNextHookEx(hHook, idHook, wParam, ByVal lParam)
KeyboardProc = 0
End If
End Function
'In a form
Private Sub Form_Load()
'set a keyboard hook
hHook = SetWindowsHookEx(WH_KEYBOARD, AddressOf KeyboardProc, App.hInstance, App.ThreadID)
End Sub
Private Sub Form_Unload(Cancel As Integer)
'remove the windows-hook
UnhookWindowsHookEx hHook
End Sub
解决方案 »
- 如何知道一个API中工用到常数呢?
- 我需要一个与RGB()函数功能相反的函数,不知道有没有。
- access和SQL数据库在SQL语句上有什么不同?
- 关于EXCEL删除列的问题
- 滚动条的问题,困惑我很长时间了!
- 关于VB连接MSSQL的问题!
- 有谁知道VB的线程怎样入门比较好?
- 哪儿有WAV转MP3的控件?
- 我的问题几乎全都没人理,困惑!!!!!!!!!!!!!!!!!!!!!!
- 有两个Access表: a , b, a表有20条记录,b表有10条记录,我想把b表的记录加入a表,a表就有了30条记录,用SQL语句怎么实现?
- 新手不懂的几个简单的问题.
- 怎么才能修改IE中安全选项中Internet项中的关于ActiveX下载项的值,我翻遍了API也没解决问题
Public Function KeyboardProc(ByVal idHook As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
If idHook < 0 Then
'call the next hook
KeyboardProc = CallNextHookEx(hHook, idHook, wParam, ByVal lParam)
Else
If (GetKeyState(VK_SHIFT) And &HF0000000) Then
'add the code
MsgBox "Shift pressed ..."
End If
Call CallNextHookEx(hHook, idHook, wParam, ByVal lParam)
KeyboardProc = 1 'return 1
End If
End Function
or
[email protected]
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