看了那个程序,她只是锁定了鼠标,键盘仍然可以使用,好象还有点不完善!而且,鼠标在用键盘新开启的程序中失去了原来的效果!我分析她的功能可能是使用了回调函数截获了windows的鼠标消息,然后通过getdc(0)的方法得到桌面的hDC,然后使用lineto划线。在启动程序之初,可能使用EnumWindows枚举了所有的窗口! EnumWindows VB声明 Declare Function EnumWindows& Lib "user32" (ByVal lpEnumFunc As Long, ByVal lParam As Long) 说明 枚举窗口列表中的所有父窗口(顶级和被所有窗口) 返回值 Long,非零表示成功,零表示失败 参数表 参数 类型及说明 lpEnumFunc Long,指向为每个子窗口都调用的一个函数的指针。用AddressOf运算符获得函数在标准模式下的地址 lParam Long,在枚举期间,传递给dwcbkd32.ocx定制控件之EnumWindows事件的值。这个值的含义是由程序员规定的 注解 我的理解——在随vb5同时提供的api32.txt文件中,找不到这个函数 GetDC VB声明 Declare Function GetDC Lib "user32" Alias "GetDC" (ByVal hwnd As Long) As Long 说明 获取指定窗口的设备场景 返回值 Long,指定窗口的设备场景句柄,出错则为0 参数表 参数 类型及说明 hwnd Long,将获取其设备场景的窗口的句柄。若为0,则要获取整个屏幕的DC 注解 若窗口所属类具有CS_OWNDC, CS_CLASSDC 或 CS_PARENTDC样式,则获取的设备场景属窗口或类专有。vb的窗体和图片框控件也是这种情况,它用该函数取得的结果和控件的hdc属性相同(在autoredraw为FALSE时)。您无须考虑取回的窗体或图片框控件设备场景的默认状态,特别是绘图对象。另外,默认状态随着窗体和控件autoredraw属性的设置而不同。在设备场景释放前您必须回复其状态为初始值。对于没有CS_OWNDC, CS_CLASSDC 或 CS_PARENTDC样式的窗口的设备场景,可从通用windows缓存中获取,其状态为默认值。缓存中可用设备场景数量是有限的,因此只要可能就释放设备场景 用本函数获取的设备场景一定要用ReleaseDC函数释放,不能用DeleteDC ReleaseDC VB声明 Declare Function ReleaseDC Lib "user32" Alias "ReleaseDC" (ByVal hwnd As Long, ByVal hdc As Long) As Long 说明 释放由调用GetDC或GetWindowDC函数获取的指定设备场景。它对类或私有设备场景无效(但这样的调用不会造成损害) 返回值 Long,执行成功为1,否则为0 参数表 参数 类型及说明 hwnd Long,要释放的设备场景相关的窗口句柄 hdc Long,要释放的设备场景句柄 注解 对那些用CreateDC一类的DC创建函数生成的设备场景,不要用本函数 LineTo VB声明 Declare Function LineTo Lib "gdi32" Alias "LineTo" (ByVal hdc As Long, ByVal x As Long, ByVal y As Long) As Long 说明 用当前画笔画一条线,从当前位置连到一个指定的点。这个函数调用完毕,当前位置变成x,y点 返回值 Long,非零表示成功,零表示失败 参数表 参数 类型及说明 hdc Long,设备场景的句柄 x,y Long,线段终点位置,采用逻辑坐标表示。这个点不会实际画出来;它不属于线段的一部分 注解 如重复调用这个函数和一个几何画笔,从而创建一系列线段,那么除非在一个路径的场景中调用,否则不会认为这些线段已结合到一起
这有什么用啊? Windows就有这个功能
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 Sub Form_Load() Dim myval As Long myval = SystemParametersInfo(97, True, CStr(1), 0) End SubPrivate Sub Text1_KeyDown(KeyCode As Integer, Shift As Integer) If Text1.Text = "12345" And KeyCode = vbKeyReturn Then Dim myval As Long myval = SystemParametersInfo(97, False, CStr(1), 0) End End If End Sub 这个程序不能屏蔽开始快捷键
先抓取当前图象,作为窗体的背景,窗体enable=false,模式全屏,然后: ''''''''''''''''禁止使用 Alt-Tab 或 Ctrl-Alt-Del Private Declare Function EnableWindow Lib "user32" (ByVal hWnd As Short, ByVal aBOOL As Short) As Short Private Declare Function IsWindowEnabled Lib "user32" (ByVal hWnd As Short) As Short Private Declare Function GetMenu Lib "user32" (ByVal hWnd As Short) As Short Private Declare Function FindWindow Lib "user32" Alias "FindWindowA"(ByVal lpClassName As String, ByVal lpWindowName As String) As Integer Private Declare Function SystemParametersInfo Lib "user32" Alias "SystemParametersInfoA"(ByVal uAction As Integer, ByVal uParam As Integer, ByVal lpvParam As Any, ByVal fuWinIni As Integer) As Integer
Private TaskBarhWnd As Integer Private IsTaskBarEnabled As Short Private TaskBarMenuHwnd As Short Const SPI_SCREENSAVERRUNNING As Short = 97 '禁止或允许使用 Alt-Tab Sub FastTaskSwitching(ByRef bEnabled As Boolean) Dim X, bDisabled As Integer bDisabled = Not bEnabled X = SystemParametersInfo(97, bDisabled, CStr(1), 0) End Sub '禁止使用Ctrl-Alt-Del Public Sub DisableTaskBar() Dim EWindow As Short 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
Public Sub EnableTaskBar() '允许使用Ctrl -Alt - Del If IsTaskBarEnabled = 0 Then IsTaskBarEnabled = EnableWindow(TaskBarhWnd, 1) End If End Sub 用法: '禁止c+a+d Dim pOld As String Call SystemParametersInfo(SPI_SCREENSAVERRUNNING, True, pOld, 0) 或 Call SystemParametersInfo(SPI_SCREENSAVERRUNNING, False, pOld, 0)至于详细怎么写看你自己的了(注意:如果程序退出前仍没有解除禁用,那么程序退出后仍有作用,除非重启!)
EnumWindows VB声明
Declare Function EnumWindows& Lib "user32" (ByVal lpEnumFunc As Long, ByVal lParam As Long)
说明
枚举窗口列表中的所有父窗口(顶级和被所有窗口)
返回值
Long,非零表示成功,零表示失败
参数表
参数 类型及说明
lpEnumFunc Long,指向为每个子窗口都调用的一个函数的指针。用AddressOf运算符获得函数在标准模式下的地址
lParam Long,在枚举期间,传递给dwcbkd32.ocx定制控件之EnumWindows事件的值。这个值的含义是由程序员规定的
注解
我的理解——在随vb5同时提供的api32.txt文件中,找不到这个函数
GetDC VB声明
Declare Function GetDC Lib "user32" Alias "GetDC" (ByVal hwnd As Long) As Long
说明
获取指定窗口的设备场景
返回值
Long,指定窗口的设备场景句柄,出错则为0
参数表
参数 类型及说明
hwnd Long,将获取其设备场景的窗口的句柄。若为0,则要获取整个屏幕的DC
注解
若窗口所属类具有CS_OWNDC, CS_CLASSDC 或 CS_PARENTDC样式,则获取的设备场景属窗口或类专有。vb的窗体和图片框控件也是这种情况,它用该函数取得的结果和控件的hdc属性相同(在autoredraw为FALSE时)。您无须考虑取回的窗体或图片框控件设备场景的默认状态,特别是绘图对象。另外,默认状态随着窗体和控件autoredraw属性的设置而不同。在设备场景释放前您必须回复其状态为初始值。对于没有CS_OWNDC, CS_CLASSDC 或 CS_PARENTDC样式的窗口的设备场景,可从通用windows缓存中获取,其状态为默认值。缓存中可用设备场景数量是有限的,因此只要可能就释放设备场景
用本函数获取的设备场景一定要用ReleaseDC函数释放,不能用DeleteDC
ReleaseDC VB声明
Declare Function ReleaseDC Lib "user32" Alias "ReleaseDC" (ByVal hwnd As Long, ByVal hdc As Long) As Long
说明
释放由调用GetDC或GetWindowDC函数获取的指定设备场景。它对类或私有设备场景无效(但这样的调用不会造成损害)
返回值
Long,执行成功为1,否则为0
参数表
参数 类型及说明
hwnd Long,要释放的设备场景相关的窗口句柄
hdc Long,要释放的设备场景句柄
注解
对那些用CreateDC一类的DC创建函数生成的设备场景,不要用本函数
LineTo VB声明
Declare Function LineTo Lib "gdi32" Alias "LineTo" (ByVal hdc As Long, ByVal x As Long, ByVal y As Long) As Long
说明
用当前画笔画一条线,从当前位置连到一个指定的点。这个函数调用完毕,当前位置变成x,y点
返回值
Long,非零表示成功,零表示失败
参数表
参数 类型及说明
hdc Long,设备场景的句柄
x,y Long,线段终点位置,采用逻辑坐标表示。这个点不会实际画出来;它不属于线段的一部分
注解
如重复调用这个函数和一个几何画笔,从而创建一系列线段,那么除非在一个路径的场景中调用,否则不会认为这些线段已结合到一起
Windows就有这个功能
(ByVal uAction As Long, ByVal uParam As Long, ByVal lpvParam As Any, _
ByVal fuWinIni As Long) As LongPrivate Sub Form_Load()
Dim myval As Long
myval = SystemParametersInfo(97, True, CStr(1), 0)
End SubPrivate Sub Text1_KeyDown(KeyCode As Integer, Shift As Integer)
If Text1.Text = "12345" And KeyCode = vbKeyReturn Then
Dim myval As Long
myval = SystemParametersInfo(97, False, CStr(1), 0)
End
End If
End Sub
这个程序不能屏蔽开始快捷键
http://www.yesky.com/20020122/214855.shtml
如果是想“锁定操作”,可以用BlockInput。
''''''''''''''''禁止使用 Alt-Tab 或 Ctrl-Alt-Del
Private Declare Function EnableWindow Lib "user32" (ByVal hWnd As Short, ByVal aBOOL As Short) As Short
Private Declare Function IsWindowEnabled Lib "user32" (ByVal hWnd As Short) As Short
Private Declare Function GetMenu Lib "user32" (ByVal hWnd As Short) As Short
Private Declare Function FindWindow Lib "user32" Alias "FindWindowA"(ByVal lpClassName As String, ByVal lpWindowName As String) As Integer
Private Declare Function SystemParametersInfo Lib "user32" Alias "SystemParametersInfoA"(ByVal uAction As Integer, ByVal uParam As Integer, ByVal lpvParam As Any, ByVal fuWinIni As Integer) As Integer
Private TaskBarhWnd As Integer
Private IsTaskBarEnabled As Short
Private TaskBarMenuHwnd As Short
Const SPI_SCREENSAVERRUNNING As Short = 97
'禁止或允许使用 Alt-Tab
Sub FastTaskSwitching(ByRef bEnabled As Boolean)
Dim X, bDisabled As Integer
bDisabled = Not bEnabled
X = SystemParametersInfo(97, bDisabled, CStr(1), 0)
End Sub
'禁止使用Ctrl-Alt-Del
Public Sub DisableTaskBar()
Dim EWindow As Short
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
Public Sub EnableTaskBar()
'允许使用Ctrl -Alt - Del
If IsTaskBarEnabled = 0 Then
IsTaskBarEnabled = EnableWindow(TaskBarhWnd, 1)
End If
End Sub
用法:
'禁止c+a+d
Dim pOld As String
Call SystemParametersInfo(SPI_SCREENSAVERRUNNING, True, pOld, 0)
或
Call SystemParametersInfo(SPI_SCREENSAVERRUNNING, False, pOld, 0)至于详细怎么写看你自己的了(注意:如果程序退出前仍没有解除禁用,那么程序退出后仍有作用,除非重启!)
http://www.applevb.com/sourcecode/lockcmp.zip