006 突破 SendKeys 的限制 98-8-22 SendKeys 不能实现一些特殊的键, 如 Alt+PrintScr 。 不过使用 API ,可以改变这样的状况。 声明: Private Declare Sub keybd_event Lib "user32" (ByVal bVk As Byte, ByVal bScan As Byte, ByVal dwFlags As Long, ByVal dwExtraInfo As Long) 使用: ' 一个抓屏的例子 Const VK_SNAPSHOT As Byte = &H2C ' 把应用窗口图象放到剪贴板: Call keybd_event(VK_SNAPSHOT, 0, 0, 0) ' 把整个屏幕抓到剪贴板: Call keybd_event(VK_SNAPSHOT, 1, 0, 0) 可以用该方法抓 AVI 图象。005 让窗口拒绝接受键盘和鼠标事件 98-7-29 声明: Private Declare Function EnableWindow Lib "user32" (ByVal hwnd As Long, ByVal fEnable As Long) As Long 使用: '拒绝接受键盘和鼠标事件 Call EnableWindow(Form.hwnd, 0) '允许接受键盘和鼠标事件 Call EnableWindow(Form.hwnd, 1)004 对象是使用 TAB 键还是鼠标激活的 声明: Declare Function GetKeyState% Lib "User32" (ByVal nVirtKey%) Const VK_TAB = 9 使用: Sub Text1_GotFocus () If GetKeyState(VK_TAB) < 0 Then Text1.SelStart = 0 Text1.SelLength = Len(Text1.Text) ' 使用了 TAB 键 Else Text1.SelLength = 0 ' 使用了 MOUSE End If End Sub003 使回车具有 Tab 的功能 98-7-04 在 VB 中,使用回车结束一个录入时,光标不能自动移到下个对象。解决方法是在该对象的 KeyPress 事件中增加以下的代码:If KeyAscii = 13 Then SendKeys "{Tab}" KeyAscii = 0 End If98-7-04 更新:如果表单中有许多对象,在所有的对象中增加以上的代码是繁琐的,解决方法是:设置表单的 KeyPreview 属性为 True,在表单的 KeyPress 中增加以上的代码。而对于无须该功能的对象,如按钮,将其 TabStop 设置为False。002 禁止使用 Alt-Tab 或 Ctrl-Alt-Del 98-7-22 Private Declare Function EnableWindow Lib "user32" (ByVal hWnd As Integer, ByVal aBOOL As Integer) As Integer Private Declare Function IsWindowEnabled Lib "user32" (ByVal hWnd As Integer) As Integer Private Declare Function GetMenu Lib "user32" (ByVal hWnd As Integer) As Integer Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) 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 LongPrivate TaskBarhWnd As Long Private IsTaskBarEnabled As Integer Private TaskBarMenuHwnd As Integer '禁止或允许使用 Alt-Tab Sub FastTaskSwitching(bEnabled As Boolean) Dim X As Long, bDisabled As Long bDisabled = Not bEnabled X = SystemParametersInfo(97, bDisabled, CStr(1), 0) End Sub '禁止使用Ctrl-Alt-Del Public Sub DisableTaskBar() Dim EWindow As Integer TaskBarhWnd = FindWindow("Shell_traywnd", "") If TaskBarhWnd <> 0 Then EWindow = IsWindowEnabled(TaskBarhWnd) If EWindow = 1 Then IsTaskBarEnabled = EnableWindow(TaskBarhWnd, 0) End If End If End Sub '允许使用Ctrl-Alt-Del Public Sub EnableTaskBar() If IsTaskBarEnabled = 0 Then IsTaskBarEnabled = EnableWindow(TaskBarhWnd, 1) End If End Sub98-7-22 禁止 Ctrl+Alt+Del 声明(For Win95): Const SPI_SCREENSAVERRUNNING = 97 Private Declare Function SystemParametersInfo Lib "user32" Alias _ "SystemParametersInfoA" (ByVal uAction As Long, ByVal uParam As Long, _ lpvParam As Any, ByVal fuWinIni As Long) As Long 使用: '禁止 Dim pOld As Boolean Call SystemParametersInfo(SPI_SCREENSAVERRUNNING, True, pOld, 0) '开启 Dim pOld As Boolean Call SystemParametersInfo(SPI_SCREENSAVERRUNNING, False, pOld, 0)001 如何过滤键盘录入 在 VB 的应用得到以前就处理键盘动作, 实现对键盘的全面控制, 可过滤任意的键。 下面的例子过滤了 CTRL+C 键, 并把该键模拟为在 Command1 上单击。 Public Declare Function CallNextHookEx Lib "user32" (ByVal hHook As Long, ByVal nCode As Long, ByVal wParam As Long, ByVal lParam As Long) As LongPublic Declare Function UnhookWindowsHookEx Lib "user32" (ByVal hHook As Long) As LongPublic Declare Function SetWindowsHookEx Lib "user32" Alias "SetWindowsHookExA" (ByVal idHook As Long, ByVal lpfn As Long, ByVal hmod As Long, ByVal dwThreadId As Long) As LongPublic Declare Function PostMessage Lib "user32" Alias "PostMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As LongPublic Const WH_KEYBOARD = 2 Public Const KBH_MASK = &H20000000 Public Const WM_LBUTTONDOWN = &H201 Public Const WM_LBUTTONUP = &H202Global hHook As Long'KeyboardProc 在 VB 应用动作前发生 Public Function KeyboardProc(ByVal nCode As Long, ByVal wParam As Long, ByVal lParam As Long) As Long If nCode >= 0 Then '处理你希望过滤的键 If wParam = Asc("C") And (lParam And KBH_MASK) <> 0 Then If (lParam And &HC0000000) = 0 Then '模拟在Command1 中单击 Form1.Command1.SetFocus Call PostMessage(Form1.Command1.hwnd, WM_LBUTTONDOWN, 0, &H20002) Call PostMessage(Form1.Command1.hwnd, WM_LBUTTONUP, 0, &H20002) KeyboardProc = 1 Exit Function End If End If End If KeyboardProc = CallNextHookEx(hHook, nCode, wParam, lParam) End FunctionPrivate Sub Form_Load() '将 KeyboardProc 连接到中断上 hHook = SetWindowsHookEx(WH_KEYBOARD, AddressOf KeyboardProc, 0&, App.ThreadID) End SubPrivate Sub Form_Unload(Cancel As Integer) Call UnhookWindowsHookEx(hHook) End Sub
针对已处理过的按键,在最近一次输入信息时,判断指定虚拟键的状态
参数 nVirtKey ,欲测试的虚拟键键码。对字母、数字字符(A-Z、a-z、0-9),用它们实际的ASCII值
SendKeys 不能实现一些特殊的键, 如 Alt+PrintScr 。 不过使用 API ,可以改变这样的状况。
声明:
Private Declare Sub keybd_event Lib "user32" (ByVal bVk As Byte, ByVal bScan As Byte, ByVal dwFlags As Long, ByVal dwExtraInfo As Long)
使用:
' 一个抓屏的例子
Const VK_SNAPSHOT As Byte = &H2C
' 把应用窗口图象放到剪贴板:
Call keybd_event(VK_SNAPSHOT, 0, 0, 0)
' 把整个屏幕抓到剪贴板:
Call keybd_event(VK_SNAPSHOT, 1, 0, 0)
可以用该方法抓 AVI 图象。005 让窗口拒绝接受键盘和鼠标事件 98-7-29
声明:
Private Declare Function EnableWindow Lib "user32" (ByVal hwnd As Long, ByVal fEnable As Long) As Long
使用:
'拒绝接受键盘和鼠标事件
Call EnableWindow(Form.hwnd, 0)
'允许接受键盘和鼠标事件
Call EnableWindow(Form.hwnd, 1)004 对象是使用 TAB 键还是鼠标激活的
声明:
Declare Function GetKeyState% Lib "User32" (ByVal nVirtKey%)
Const VK_TAB = 9
使用:
Sub Text1_GotFocus ()
If GetKeyState(VK_TAB) < 0 Then
Text1.SelStart = 0
Text1.SelLength = Len(Text1.Text)
' 使用了 TAB 键
Else
Text1.SelLength = 0
' 使用了 MOUSE
End If
End Sub003 使回车具有 Tab 的功能 98-7-04
在 VB 中,使用回车结束一个录入时,光标不能自动移到下个对象。解决方法是在该对象的 KeyPress 事件中增加以下的代码:If KeyAscii = 13 Then
SendKeys "{Tab}"
KeyAscii = 0
End If98-7-04 更新:如果表单中有许多对象,在所有的对象中增加以上的代码是繁琐的,解决方法是:设置表单的 KeyPreview 属性为 True,在表单的 KeyPress 中增加以上的代码。而对于无须该功能的对象,如按钮,将其 TabStop 设置为False。002 禁止使用 Alt-Tab 或 Ctrl-Alt-Del 98-7-22
Private Declare Function EnableWindow Lib "user32" (ByVal hWnd As Integer, ByVal aBOOL As Integer) As Integer
Private Declare Function IsWindowEnabled Lib "user32" (ByVal hWnd As Integer) As Integer
Private Declare Function GetMenu Lib "user32" (ByVal hWnd As Integer) As Integer
Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) 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 LongPrivate TaskBarhWnd As Long
Private IsTaskBarEnabled As Integer
Private TaskBarMenuHwnd As Integer
'禁止或允许使用 Alt-Tab
Sub FastTaskSwitching(bEnabled As Boolean)
Dim X As Long, bDisabled As Long
bDisabled = Not bEnabled
X = SystemParametersInfo(97, bDisabled, CStr(1), 0)
End Sub
'禁止使用Ctrl-Alt-Del
Public Sub DisableTaskBar()
Dim EWindow As Integer
TaskBarhWnd = FindWindow("Shell_traywnd", "")
If TaskBarhWnd <> 0 Then
EWindow = IsWindowEnabled(TaskBarhWnd)
If EWindow = 1 Then
IsTaskBarEnabled = EnableWindow(TaskBarhWnd, 0)
End If
End If
End Sub
'允许使用Ctrl-Alt-Del
Public Sub EnableTaskBar()
If IsTaskBarEnabled = 0 Then
IsTaskBarEnabled = EnableWindow(TaskBarhWnd, 1)
End If
End Sub98-7-22 禁止 Ctrl+Alt+Del
声明(For Win95):
Const SPI_SCREENSAVERRUNNING = 97
Private Declare Function SystemParametersInfo Lib "user32" Alias _
"SystemParametersInfoA" (ByVal uAction As Long, ByVal uParam As Long, _
lpvParam As Any, ByVal fuWinIni As Long) As Long
使用:
'禁止
Dim pOld As Boolean
Call SystemParametersInfo(SPI_SCREENSAVERRUNNING, True, pOld, 0)
'开启
Dim pOld As Boolean
Call SystemParametersInfo(SPI_SCREENSAVERRUNNING, False, pOld, 0)001 如何过滤键盘录入
在 VB 的应用得到以前就处理键盘动作, 实现对键盘的全面控制, 可过滤任意的键。 下面的例子过滤了 CTRL+C 键, 并把该键模拟为在 Command1 上单击。 Public Declare Function CallNextHookEx Lib "user32" (ByVal hHook As Long, ByVal nCode As Long, ByVal wParam As Long, ByVal lParam As Long) As LongPublic Declare Function UnhookWindowsHookEx Lib "user32" (ByVal hHook As Long) As LongPublic Declare Function SetWindowsHookEx Lib "user32" Alias "SetWindowsHookExA" (ByVal idHook As Long, ByVal lpfn As Long, ByVal hmod As Long, ByVal dwThreadId As Long) As LongPublic Declare Function PostMessage Lib "user32" Alias "PostMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As LongPublic Const WH_KEYBOARD = 2
Public Const KBH_MASK = &H20000000
Public Const WM_LBUTTONDOWN = &H201
Public Const WM_LBUTTONUP = &H202Global hHook As Long'KeyboardProc 在 VB 应用动作前发生
Public Function KeyboardProc(ByVal nCode As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
If nCode >= 0 Then
'处理你希望过滤的键
If wParam = Asc("C") And (lParam And KBH_MASK) <> 0 Then
If (lParam And &HC0000000) = 0 Then
'模拟在Command1 中单击
Form1.Command1.SetFocus
Call PostMessage(Form1.Command1.hwnd, WM_LBUTTONDOWN, 0, &H20002)
Call PostMessage(Form1.Command1.hwnd, WM_LBUTTONUP, 0, &H20002)
KeyboardProc = 1
Exit Function
End If
End If
End If
KeyboardProc = CallNextHookEx(hHook, nCode, wParam, lParam)
End FunctionPrivate Sub Form_Load()
'将 KeyboardProc 连接到中断上
hHook = SetWindowsHookEx(WH_KEYBOARD, AddressOf KeyboardProc, 0&, App.ThreadID)
End SubPrivate Sub Form_Unload(Cancel As Integer)
Call UnhookWindowsHookEx(hHook)
End Sub