代码共享】关于Win2K/NT/XP环境下LWIN,RWIN,WIN+Any,Ctrl+Esc,Alt+Esc,Alt+TAB等键的禁用

yinweihong 2004-08-26 12:45:24
参考国外一些网站,论坛代码,得到以下综合,以上环境中测试通过,版权归原作者所有。
add a checkbox named chkDisable.caption="&Disable ALT-TAB, ALT-ESC, CTRL-ESC,LWin,RWin,Win+Any"
to a new from named frmMain.frm in new project hook_kb_LL.vbp
add code below:

Option Explicit

Dim hhkLowLevelKybd As Long

Private Sub chkDisable_Click()
If chkDisable = vbChecked Then
hhkLowLevelKybd = SetWindowsHookEx(WH_KEYBOARD_LL, AddressOf LowLevelKeyboardProc, App.hInstance, 0)
Else
UnhookWindowsHookEx hhkLowLevelKybd
hhkLowLevelKybd = 0
End If
End Sub

Private Sub Form_Unload(Cancel As Integer)
If hhkLowLevelKybd <> 0 Then UnhookWindowsHookEx hhkLowLevelKybd
End Sub

in new module named modDisableLowLevelKeys.bas
code below:
Option Explicit

Public Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long)
Public Declare Function GetKeyState Lib "user32" (ByVal nVirtKey As Long) As Integer
Public 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
Public Declare Function CallNextHookEx Lib "user32" (ByVal hHook As Long, ByVal nCode As Long, ByVal wParam As Long, lParam As Any) As Long
Public Declare Function UnhookWindowsHookEx Lib "user32" (ByVal hHook As Long) As Long
Public Const HC_ACTION = 0
Public Const WM_KEYDOWN = &H100
Public Const WM_KEYUP = &H101
Public Const WM_SYSKEYDOWN = &H104
Public Const WM_SYSKEYUP = &H105
Public Const VK_TAB = &H9
Public Const VK_CONTROL = &H11
Public Const VK_ESCAPE = &H1B

Public Const WH_KEYBOARD_LL = 13
Public Const LLKHF_ALTDOWN = &H20

Public Type KBDLLHOOKSTRUCT
vkCode As Long
scanCode As Long
flags As Long
time As Long
dwExtraInfo As Long
End Type

Dim p As KBDLLHOOKSTRUCT

Public Function LowLevelKeyboardProc(ByVal nCode As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Dim fEatKeystroke As Boolean

If (nCode = HC_ACTION) Then
If wParam = WM_KEYDOWN Or wParam = WM_SYSKEYDOWN Or wParam = WM_KEYUP Or wParam = WM_SYSKEYUP Then
CopyMemory p, ByVal lParam, Len(p)
fEatKeystroke = _
((p.vkCode = VK_TAB) And ((p.flags And LLKHF_ALTDOWN) <> 0)) Or _
((p.vkCode = VK_ESCAPE) And ((p.flags And LLKHF_ALTDOWN) <> 0)) Or _
((p.vkCode = VK_ESCAPE) And ((GetKeyState(VK_CONTROL) And &H8000) <> 0)) Or _
((p.vkCode = 91) Or (p.vkCode = 92) Or (p.vkCode = 93)) '左右Win 和徽标键
End If
End If

If fEatKeystroke Then
LowLevelKeyboardProc = -1
Else
LowLevelKeyboardProc = CallNextHookEx(0, nCode, wParam, ByVal lParam)
End If
End Function


顺便散分 ,呵呵 早几天好象技术专家分55555,扩充话题也是555,哭死!!! 晕~~~~~~~~~~
...全文
381 38 打赏 收藏 转发到动态 举报
写回复
用AI写文章
38 条回复
切换为时间正序
请发表友善的回复…
发表回复
iPUD 2005-08-05
  • 打赏
  • 举报
回复
好东西,分享分享
受用受用
liu9965012 2004-09-13
  • 打赏
  • 举报
回复
怎么按你的代码做成ocx控件在页面上调用就不行了
yinweihong 2004-09-01
  • 打赏
  • 举报
回复
揭贴,加入FAQ,要的再找~```````````
xzhy80 2004-08-30
  • 打赏
  • 举报
回复
up
熊孩子开学喽 2004-08-30
  • 打赏
  • 举报
回复
来拿分
yinweihong 2004-08-30
  • 打赏
  • 举报
回复
呵呵
所谓的禁用“Windows 任务管理器”
Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Private Declare Function PostMessage Lib "user32" Alias "PostMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
Const SW_SHOWNORMAL = 1
Const WM_CLOSE = &H10

Private Sub Form_Load()
Timer1.Enabled = True
End Sub

Private Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer)
Timer1.Enabled = False
End Sub

Private Sub Form_Resize()
Me.Hide
End Sub

Private Sub Timer1_Timer()
Dim WinWnd As Long, Ret As String, RetVal As Long, lpClassName As String
Ret = "Windows 任务管理器"
WinWnd = FindWindow(vbNullString, Ret)
If WinWnd = 0 Then
Exit Sub
End If
PostMessage WinWnd, WM_CLOSE, 0&, 0&
End Sub

设置Timer1.interval=1
bciAnson 2004-08-27
  • 打赏
  • 举报
回复
好贴。
apple_001 2004-08-27
  • 打赏
  • 举报
回复
一个字---晕
xanger 2004-08-27
  • 打赏
  • 举报
回复
收到!
lxcc 2004-08-27
  • 打赏
  • 举报
回复


uAction常数表——请参考SystemParametersInfo函数
请参考windows用户手册,了解关于这些参数以及注册表或win.ini文件的详细情况。如参数不是为一个行动指定的,则没有使用。在许多许多情况下系统参数都有自己对应的 GET 和 SET 行动;例如 SPI_GETACCESSTIMEOUT 和 SPI_SETACCESSTIMEOUT。在这些情况下,除非特别指明,否则它们之间唯一的区别就是一个用于取得信息,另一个设置信息。针对 SET 条目,只列出参数间的差异
常数 含义
SPI_GETACCESSTIMEOUT lpvParam是一个ACCESSTIMEOUT结构,其中要载入辅助访问特性计时信息。在调用函数之前,uParam必须设为ACCESSTIMEOUT结构的大小
SPI_GETANIMATION lpvParam是一个ANIMATIONINFO结构,将在其中载入窗口最小化和恢复时的动画信息。不能在NT 3.51中使用
SPI_GETBEEP lpvParam是一个Long型数据,若打开了响铃声,则设为TRUE
SPI_GETBORDER lpvParam是一个Long型数据,用于接收一个乘数(倍数),对大小可变的窗口的边框尺寸进行控制
SPI_GETDEFAULTINPUTLANG lpvParam是一个Long型数据,用于接收默认键盘布局的一个32位句柄。不能用于NT 3.51
SPI_GETDRAGFULLWINDOWS lpvParam是一个Long型数据,如在整个窗口上拖动,就会设为TRUE。如果只拖出了一个矩形轮廓,则为FALSE。要求NT 4.0 或 Windows 95支持。其中,Windows 95必须有Plus!支持,或直接安装Windows 95 OSR2
SPI_GETFASTTASKSWITCH lpvParam是一个Long型数据,如允许快速任务切换,则为TRUE。在Windows 95 和 NT 4.0中肯定是TRUE
SPI_GETFILTERKEYS lpvParam是一个FILTERKEYS结构,用于装载与键盘有关的辅助访问特性信息
SPI_GETFONTSMOOTHING lpvParam是一个Long型数据,如打开了边缘修饰特性(让字体更圆润),则为TRUE。只适用于 NT 4.0 和带 Plus! 支持的 Windows 95
SPI_GETGRIDGRANULARITY lpvParam是一个Long型数据,会设为网格间隔尺寸值
SPI_GETHIGHCONTRAST lpvParam是一个HIGHCONTRAST结构,用于装载与用户显示器有关的辅助访问特性信息。仅适用于Win95
SPI_GETICONMETRICS lpvParam是一个ICONMETRICS结构,用于装载与图标比例及排列有关的信息。仅适用于Windows 95 及 NT 4.0
SPI_GETICONTITLELOGFONT lpvParam指向一个LOGFONT结构,设置内容取决于图标标题采用的字体
SPI_GETICONTITLEWRAP lpvParam是一个Long型数据,如允许对图标标题进行自动换行,则设为TRUE
SPI_GETKEYBOARDDELAY lpvParam是一个Long型数据,设为键盘重复延时
SPI_GETKEYBOARDPREF lpvParam是一个Long型数据,如用户更喜欢用键盘而不是鼠标,则设为TRUE。如这个参数为真,windows会显示出附加的键盘接口信息,只适用于win95
SPI_GETKEYBOARDSPEED lpvParam是一个Long型数据,设为键盘的重复速率
SPI_GETMENUDROPALIGNMENT lpvParam是一个Long型数据,若弹出式菜单左对齐(默认),则设为FALSE。否则为TRUE
SPI_GETMINIMIZEDMETRICS lpvParam是一个MINIMIZEDMETRICS结构,用于装载与最小化窗口的比例及排列有关的信息。仅适用于win95
SPI_GETMOUSE lpvParam是三元素Long数组的头一个条目,条目0设为用户配置MouseThreshold1字段,条目1设为MouseThreshold2字段,条目2设为MouseSpeed
SPI_GETMOUSEKEYS lpvParam是一个MOUSEKEYS结构,要在其中装载与鼠标有关的辅助访问信息。不能在 NT 3.51中使用
SPI_GETNONCLIENTMETRICS lpvParam是一个NONCLIENTMETRICS结构,要在其中装载有关字体和环境有关的信息;这些信息会在描绘窗口非客户区域时涉及到,如边框、标题等。只适用于win95
SPI_GETSCREENSAVEACTIVE lpvParam指向一个整数;倘若屏幕保护程序处于活动状态,则设为TRUE;否则设为FALSE
SPI_GETSCREENSAVETIMEOUT lpvParam指向一个整数;它设为屏幕保护延时(以秒为单位)
SPI_GETSERIALKEYS lpvParam是一个SERIALKEYS结构,用于装载与输入设备(用于模拟键盘输入)有关的辅助访问特性信息。只适用于win95
SPI_GETSHOWSOUNDS lpvParam是一个Long型数据,倘若应用程序应该用可视线索来代替声音,则设为TRUE。它的作用与GetSystemMetrics函数的SM_GETSHOWSOUNDS选项是相同的
SPI_GETSNAPTODEFBUTTON lpvParam是一个Long型数据,倘若鼠标会自动移到新对话框的默认按钮,则设为TRUE。只适用于NT 4.0
SPI_GETSOUNDSENTRY lpvParam是一个SOUNDSENTRY结构,用于装载让windows提供可视标志(而不是系统声音)时涉及的辅助访问特征信息。调用之前,必须将uParam设为SOUNDSENTRY结构的长度
SPI_GETSTICKYKEYS lpvParam是一个STICKYKEYS结构,用于装载允许一名用户顺序按键(而不是同时按下)时涉及的辅助访问特征信息。同时按键的例子包括Shift+, Ctrl+, Alt+ 等。调用之前,必须将uParam设为STICKYKEYS结构的长度
SPI_GETTOGGLEKEYS lpvParam是一个TOGGLEKEYS结构,要在其中装载按下一个开关键(NumLock,CapsLock,ScrollLock)后播放声音提示时涉及的辅助访问特征信息。windows会用一个不同的声音指出开或关状态。调用之前,必须将uParam设为TOGGLEKEYS结构的长度
SPI_GETWORKAREA lpvParam是一个RECT结构,用于装载屏幕的工作区
SPI_ICONHORIZONTALSPACING 如lpvParam为NULL,则uParam代表桌面图标新的水平间隔距离,以像素为单位
SPI_ICONVERTICALSPACING 与SPI_ICONHORIZONTALSPACING相似,只不过指定图标的垂直间距
SPI_LANGDRIVER lpvParam是一个字串,用于容纳新的语言驱动程序文件的名称
SPI_SETACCESSTIMEOUT 与SPI_GETACCESSTIMEOUT的参数相同
SPI_SETANIMATION 与SPI_GETANIMATION的参数相同
SPI_SETBEEP uParam为TRUE时打开响铃,FALSE关闭
SPI_SETBORDER uParam代表一个乘数,用于控制尺寸可变的的窗口边框的大小
SPI_SETDEFAULTINPUTLANG 与SPI_GETDEFAULTINPUTLANG的参数相同
SPI_SETDESKPATTERN 从注册表或win.ini中强制窗口恢复当前的桌面方案
SPI_SETDESKWALLPAPER lpvParam代表一个字串,用于容纳作为桌面墙纸使用的一个位图文件的名称
SPI_SETDOUBLECLICKTIME uParam代表连续两次单击被当作一次双击处理时需要间隔的时间(以毫秒为单位)
SPI_SETDOUBLECLKHEIGHT uParam代表新的双击高度,可参考GetSystemMetrics函数的注解
SPI_SETDOUBLECLKWIDTH uParam代表新的双击宽度,可参考GetSystemMetrics函数的注解
SPI_DRAGFULLWINDOWS uParam为TRUE时打开全窗口拖动,否则为FALSE。仅适用于win95
SPI_SETDRAGHEIGHT uParam代表一个矩形的高度(以像素为单位),用于决定拖动操作何时开始。只适用于win95
SPI_SETDRAGWIDTH uParam代表一个矩形的宽度(以像素为单位),用于决定拖动操作何时开始。只适用于win95
SPI_SETFASTTASKSWITCH uParam为TRUE时打开快速任务切换,FALSE则关闭
SPI_FILTERKEYS 参数与 SPI_GETFILTERKEYS 相同
SPI_SETFONTSMOOTHING uParam为TRUE时打开字体修饰(圆润)。只能在NT 4.0 和得到 Plus! 支持的 Win95(或 Windows 95 OSR2)中使用
SPI_SETGRIDGRANULARITY uParam代表新的网格间距
SPI_SETHIGHCONTRAST 参数与 SPI_GETHIGHCONTRAST 相同
SPI_SETICONMETRICS 参数与 SPI_GETICONMETRICS 相同
SPI_SETICONTITLELOGFONT lpvParam是一个LOGFONT结构,用于定义图标标题采用的字体。uParam指定LOGFONT结构的大小。如两者均为NULL,则采用系统启动时定义的字体
SPI_SETICONTITLEWRAP uParam为TRUE时打开图标标题自动换行
SPI_SETKEYBOARDDELAY uParam代表新的键盘重复延时
SPI_SETKEYBOARDPREF 若uParam为TRUE,表明用户相比键盘和鼠标更喜欢用前者。参考SPI_GETKEYBOARDPREF
SPI_SETKEYBOARDSPEED uParam代表新的键盘重复速率
SPI_SETLANGTOGGLE 令窗口从系统注册表中重新装载热键信息,以便在键盘布局之间交换
SPI_SETLOWPOWERACTIVE uParam为TRUE时允许节能屏幕保护程序模式。只适用于win95
SPI_SETLOWPOWERTIMEOUT uParam代表新的节能屏幕保护程序延时。只适用于win95
SPI_SETMENUDROPALIGNMENT uParam为FALSE时设置弹出菜单左对齐,TRUE则右对齐
SPI_SETMINIMIZEDMETRICS 参数与SPI_GETMINIMIZEDMETRICS一样
SPI_SETMOUSE lpvParam是一个三元素整数数组的头一个条目,其中包含了鼠标设置。参考SPI_GETMOUSE
SPI_SETMOUSEBUTTONSWAP uParam为TRUE时交换左右鼠标按钮的功能;如果为FALSE,则使用原来的值
SPI_SETMOUSEKEYS 参数与SPI_GETMOUSEKEYS一样
SPI_SETNONCLIENTMETRICS 参数与SPI_GETNONCLIENTMETRICS一样
SPI_SETPENWINDOWS uParam为TRUE时载入笔窗口,FALSE则卸载
SPI_SETPOWEROFFACTIVE uParam为TRUE时允许停电屏幕保护模式。只适用于win95
SPI_SETPOWEROFFTIMEOUT uParam代表新的停电屏幕保护程序延时。只适用于win95
SPI_SETSCREENREADER uParam为TRUE时表示正在运行一个屏幕阅读程序。参考SPI_GETSCREENREADER
SPI_SETSCREENSAVEACTIVE uParam为TRUE时激活屏幕保护程序;FALSE表示禁止
SPI_SETSCREENSAVETIMEOUT uParam代表新的屏幕保护延迟时间,以秒为单位
SPI_SETSERIALKEYS 参数与 SPI_GETSERIALKEYS 相同
SPI_SETSHOWSOUNDS uParam为TRUE时允许窗口开启声音提示辅助访问特性。参考SPI_GETSHOWSOUNDS
SPI_SETSNAPTODEFBUTTON 如鼠标应自动移到新对话框的默认按钮,则uParam为TRUE。只适用于NT 4.0
SPI_SETSOUNDSENTRY 与 SPI_GETSOUNDSENTRY 相同
SPI_SETSTICKYKEYS 与 SPI_GETSTICKYKEYS 相同
SPI_SETTOGGLEKEYS 与 SPI_GETTOGGLEKEYS 相同
SPI_SETWORKAREA 与 SPI_GETWORKAREA 相同
请参考最新的Win32手册,了解SystemParametersInfo函数是否又新支持了一些常数。上述表格已随同NT 4.0进行了更新,但仍未提供涉及新型鼠标轮支持的常数。
lxcc 2004-08-27
  • 打赏
  • 举报
回复
SystemParametersInfo, SystemParametersInfoByval


VB声明
Declare Function SystemParametersInfo& Lib "user32" Alias "SystemParametersInfoA" (ByVal uAction As Long, ByVal uParam As Long, lpvParam As Any, ByVal fuWinIni As Long)
Declare Function SystemParametersInfoByVal& Lib "user32" Alias "SystemParametersInfoA" (ByVal uAction As Long, ByVal uParam As Long, ByVal lpvParam As Any, ByVal fuWinIni As Long)
说明
允许获取和设置数量众多的windows系统参数
返回值
Long,非零表示成功,零表示失败。会设置GetLastError
参数表
参数 类型及说明
uAction Long,指定要设置的参数。参考uAction常数表
uParam Long,参考uAction常数表
lpvParam Any,按引用调用的Integer、Long和数据结构。对于String数据,请用SystemParametersInfoByval函数。具体用法参考uAction常数表
fuWinIni Long,取决于不同的参数及操作系统,随同这个函数设置的用户配置参数保存在win.ini或注册表里,或同时保存在这两个地方。这个参数规定了在设置系统参数的时候,是否应更新用户设置参数。可以是零(禁止更新),或下述任何一个常数:
SPIF_UPDATEINIFILE 更新win.ini和(或)注册表中的用户配置文件
SPIF_SENDWININICHANGE 倘若也设置了SPIF_UPDATEINIFILE,将一条WM_WININICHANGE消息发给所有应用程序。否则没有作用。这调消息告诉应用程序已经改变了用户配置设置
注解
在调用这个函数之前,特别要注意将lpvParam参数定义成正确的数据类型
rainstormmaster 2004-08-27
  • 打赏
  • 举报
回复
dsclub(兀儿 - 干部):
欢迎回来:)
dsclub 2004-08-27
  • 打赏
  • 举报
回复


好久不来VB了, rainstormmaster(暴风雨 v2.0) 都三颗星了!

jam021 2004-08-27
  • 打赏
  • 举报
回复
好东西,顶了!
daisy8675 2004-08-26
  • 打赏
  • 举报
回复
mark 参考下:D
yinweihong 2004-08-26
  • 打赏
  • 举报
回复
呵呵,一些外挂游戏中可以禁用那些键,避免最小化的~
yinweihong 2004-08-26
  • 打赏
  • 举报
回复
1楼,我顶出水面!!!!!!!!!!
jam021 2004-08-26
  • 打赏
  • 举报
回复
顺便接分!
jam021 2004-08-26
  • 打赏
  • 举报
回复
好东西啊,谢谢楼主,学习中~~~~~~~~~~~~~
51365133 2004-08-26
  • 打赏
  • 举报
回复
哈哈,怎么没有写怎么屏蔽 ctrl + alt +del 呀?我要分
加载更多回复(18)

7,763

社区成员

发帖
与我相关
我的任务
社区描述
VB 基础类
社区管理员
  • VB基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧