我在做一个计数系统中,当用户按下了一个特殊键(可能是休眠键,/还是其它键,我不能确定,顺便请教:?)我的计数器就停止计数!我该怎么办啊?
如果要屏蔽休眠键,代码怎么写呢?         请求各位大侠赐教!   为盼:)

解决方案 »

  1.   

    看这个例子:在 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
      

  2.   

    用VB编写键盘拦截程序   我们知道,在一些程序中,有一些快捷方式(如:Shift键最小化、ESC键退出、Ctrl+S存盘、Alt+x退出等等)。以前有一些介绍使用Win32 API可以做到,但过于繁琐,其实VB本身已经给我们提供了这个功能。
      我们来新建一个窗体Form1,对于键盘操作可以看到有三个事件KeyPress(),KeyDown和KeyUp,下面我对它们分别介绍:
      KeyPress()事件是当用户按下和松开一个 ANSI 键时发生(ANSI是可见ASCII字符1-127)。
      语法
      Private Sub object_KeyPress([index As Integer,]keyascii As Integer)
      KeyPress 事件语法包含下列部分:
       部分 描述
      object 一个对象表达式,其值是“应用于”列表中的一个对象。
      index 一个整数,它用来唯一标识一个在控件数组中的控件(仅有控件数组时才有)。
      keyascii 是返回一个标准数字 ANSI 键代码的整数。Keyascii 通过引用传递,对它进行改变可给对象
      发送一个不同的字符。将 keyascii 改变为 0 时可取消击键,这样一来对象便接收不到字符。
      说明
      具有焦点的对象接收该事件。一个窗体仅在KeyPreview 属性被设置为 True 时才能接收该事件。一个 KeyPress 事件可以引用任何可打印的键盘字符,一个来自标准字母表的字符或少数几个特殊字符之一的字符与 CTRL 键的组合,以及 ENTER 或BACKSPACE键。KeyPress()事件过程在截取 TextBox 或 ComboBox 控件所输入的击键时是非常有用的。它可立即测试击键的有效性或在字符输入时对其进行格式处理。改变 keyascii 参数的值会改变所显示的字符。
      可使用下列表达式将 keyascii 参数转变为一个字符:
      Chr(KeyAscii)
      然后执行字符串操作,并将该字符反译成一个控件可通过该表达式解释的 ANSI 数字:
      KeyAscii = Asc(char)
      在KeyPress()处理不了的功能可以由KeyDown()和KeyUp()事件来处理:
      语法
       Private Sub object_KeyDown([index As Integer,]keycode As Integer, shift As Integer)
      Private Sub object_KeyUp([index As Integer,]keycode As Integer, shift As Integer)
      KeyDown 和 KeyUp 事件包括下列部分:
      部分 描述
      object 一个对象表达式,其值是“应用于”列表中的一个对象。
      index 是一个整数,它用来唯一标识一个在控件数组中的控件(仅有控件数组时才有)。
      keycode 是一个键代码,诸如 vbKeyF1 ( F1 键)或 vbKeyHome ( HOME 键)。
      shift 是在该事件发生时响应 SHIFT ,CTRL 和 ALT 键的状态的一个整数。shift、CTRL、ALT 键在这些位分别对应于值 1、2 和 4。例如:如果 CTRL 和 ALT 这两个键都被按下,则 shift 的值为 6。
      说明
      对于这两个事件来说,带焦点的对象都接收所有击键。一个窗体只有在不具有可视的和有效的控件时才可以获得焦点。虽然KeyDown()和KeyUp()事件可应用于大多数键,它们最经常地还是应用于:扩展的字符键如功能键、定位键、键盘修饰键和按键的组合、区别数字小键盘和常规数字键;在需要对按下和松开一个键都响应时,可使用 KeyDown 和 KeyUp 事件过程。
      下列情况不能引用 KeyDown 和 KeyUp 事件:窗体有一个 CommandButton 控件,并且 Default 属性设置为 True 时的 ENTER 键。窗体有一个 CommandButton 控件,并且 Cancel 属性设置为 True 时的 ESC 键、TAB键,KeyDown 和 KeyUp 用两种参数解释每个字符的大写形式和小写形式:keycode —显示物理的键(将 A 和 a 作为同一个键返回)和shift—显示shift+key键的状态而且返回A或a其中之一。
      如果需要测试 shift 参数,可使用该参数中定义各位的 shift 常数。该常数有下列值:
      常数 值 描述
      vbShiftMask 1 HIFT 键的位
       屏蔽。
      VbCtrlMask 2 CTRL 键的
       位屏蔽。
      VbAltMask 4 ALT 键的位
       屏蔽。
      该常数用作位屏蔽,它可被用来测试任何键组合。
      注意:如果 KeyPreview 属性被设置为 True,则一个窗体先于该窗体上的控件接收到此事件。可用 KeyPreview 属性来创建全局键盘处理例程。
      了解了以上知识,我们可以制作出非常完美而且带有快捷键的程序,例如我们在一个程序中要用Ctrl+S存盘,Shift最小化,Alt+X和ESC退出:
      首先启动vb选择新建EXE文件,在Form1窗体上拉一个TextBox,并把Form1的KeyPreview属性设为True,双击Form1,选择Form的KeyPress事件,输入如下代码:
      Private Sub Form_KeyPress(KeyAscii as Integer) 'Esc键退出,VbEscape可以用27代替
      If KeyAscii=VbEscape then End
      End Sub
      在Form的KeyDown事件中输入如下代码:
      Private Sub Form_KeyDown(KeyCode as Integer,Shift as Integer) '处理Ctrl+X,Shift,Alt+X
      If Shift=2 And KeyCode=VbKeyS Then Print #FileNum,Form1.Text1.Text 'Ctrl+S存盘,VbKeyS=83
      If shift=2 then Form1.WindowState=1 'Shift最小化
      If Shift=4 And KeyCode=VbKeyX Then End 'Alt+X退出,VbkeyX=88
      End Sub
      在Form的Load事件中输入如下代码:
      Private Sub Form_load()
      Dim FileNum as integer
      FileNum=FreeFile
      Open App.Path+“\Sample.txt" For Append As #FileNum
      End Sub
      运行它就可以实现我们所要求的功能了,举这个例子只是抛砖引玉的作用,利用它我们还可以编写
      

  3.   

    参考一下:
    怎样使Ctrl-Alt-Delete无效? 
    声明以下函数: 
    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 
    编写如下函数: 
    Sub DisableCtrlAltDelete(bDisabled As Boolean) 
    Dim X As Long 
    X = SystemParametersInfo(97, bDisabled, CStr(1), 0) 
    End Sub 
    使Ctrl-Alt-Delete无效 : 
    Call DisableCtrlAltDelete(True) 
    恢复Ctrl-Alt-Delete : 
    Call DisableCtrlAltDelete(False)