求解,记得以前看到过一个函数,调用后可以停止对用户键盘的响应。

bendou16 2004-01-30 09:36:50
请记得的朋友给提个醒!!!
高分想送
...全文
88 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
Pipi0714 2004-01-31
  • 打赏
  • 举报
回复
系统钩子HOOK挺好!
karlson0211 2004-01-31
  • 打赏
  • 举报
回复
collection!
NOMADBLUE 2004-01-30
  • 打赏
  • 举报
回复
用系统钩子HOOK怎么样?
zhangcrony 2004-01-30
  • 打赏
  • 举报
回复
樓上的文章﹐收藏了﹗
tabris17 2004-01-30
  • 打赏
  • 举报
回复
如果仅仅是要屏蔽普通的键盘鼠标输入是很简单的,在windows98和windows2000及其以上版本的系统有一个API
函数,名叫“BlockInput”。这个函数由user32.dll导出。通过如下代码可以屏蔽键盘和鼠标输入:

BOOL (__stdcall *BlockInput)(BOOL fBlock);//函数原型

BlockInput=(void *)GetProcAddress(GetModuleHandle("user32.dll")/*LoadLibrary("user32.dll")*/,"BlockInput");
if(BlockInput)
BlockInput(TRUE);
else
return FASLE;
Sleep(100000);
BlockInput(FALSE);

当遇到下面情况系统便会解除对鼠标键盘输入的禁止:

1、当进程调用 BlockInput(FALSE) 时;
2、按下“Ctrl+Alt+Del”时;
3、当调用 BlockInput 的进程结束时;

如果只是要单独对键盘或是鼠标进行输入限制就要使用其它方法了。要限制鼠标输入比较简单,使用ClipCursor
函数就可以了。下面代码对鼠标活动范围进行限制:

RECT rect;
rect.bottom=0;
rect.left=0;
rect.right=0;
rect.top=0;
ClipCursor(&rect);

但是只要弹出系统菜单这个限制就被取消了,所以还要连带地禁止 WIN 热键。对于 Windows 9x 操作系统来说,
要做到这一点十分简单,只要让系统认为当前为屏保状态就可以屏蔽 WIN 热键了:

SystemParametersInfo(SPI_SCREENSAVERRUNNING,TRUE,NULL,SPIF_UPDATEINIFILE);

但对于 windows 2000 而言就比较麻烦了,必须使用“底层系统钩子”。代码比较长,这里不写出来了,你可以
在 MSDN 中查找“WH_KEYBOARD_LL”。

不过这种限制在 windows 2000 还是有很大缺陷的。在 windows 2000 下,“Ctrl+Alt+Del”是无法屏蔽的,这
和当前的登陆状态有关了,网上有介绍用自定义的 gina.dll 来实现屏蔽系统对“Ctrl+Alt+Del”响应,这里
就不作介绍了。其实,在 windows 操作系统中,所有的硬件输入都由原始输入线程(Raw Input Thread,RIT)来
处理的。这个线程负责输入设备的硬件驱动和系统各线程的输入队列沟通,RIT将硬件输入队列(SHIQ)中的硬件
输入事件转换成相关的键盘或鼠标消息,添加到适当的虚拟输入队列(VIQ)中。所有的鼠标键盘输入均由这个
RIT来决定究竟如何处理,系统热键都是由RIT直接处理的。底层系统钩子就存在于SHIQ和VIQ之间,此时所有的
硬件输入还未转换成鼠标键盘消息,所以底层系统钩子可以拦截系统热键,但是还是无法拦截“Ctrl+Alt+Del”。
如果能找到这个RIT,然后挂起它,就能真正做到屏弊输入了。在 windows 2000 中,RIT是由csrss.exe进程创
建的。我的操作系统是 windows 2000+sp4,csrss.exe共有10个线程。通过测试知道,其中有2个线程分别是处
理鼠标和键盘输入的,另有一个线程负责处理命令行窗口的。但要知道究竟哪两个线程是RIT还是比较困难的,
不可能象我那样一次次地手工测试。我也没有好的方法来获得这两个RIT,但经过测试发现几点特征:第一、每
个系统的RIT的线程ID(可能)是不变的。在我的系统上,这两个TID始终是172和240,毕竟系统所有的PID和TID都
是由csrss.exe进程自己分配的。但是这不具备通用性,不同系统上的TID可能都不一样。第二、这两个RIT的创
建时间(可能)是一致的。但剩余的8个线程也可能其中两个的创建时间是相同的,这样就无法区分了。第三、这
两个RIT的kernel time(可能)是10个线程中最高的,但是系统刚运行时所有线程的kernel time都是零。








bendou16 2004-01-30
  • 打赏
  • 举报
回复
记得是在一个黑客编程网站上看到的,,,,可以禁止键盘输入n秒,,,
zhangcrony 2004-01-30
  • 打赏
  • 举报
回复
貼一篇關于在VB中實現的文章﹐供參考﹐提個思路:

如何使键盘、Mouse失效(JournalPlayBack Hook)

我们常见一些导览系统或教学系统,会自动移动Mouse与Keyin字,而那个时候,我们

不管Keyin或动Mouse都没有效,直到完成了导览系统的某个动作後才让使用者可以移

动Mouse与做Keyin的动作;想做到这个,要借重JournalPlayBack Hook。


JournalPlayBack Hook,它和JournalRecord Hook合称Journal Hook,它们作用

的范围是整个System,也就是挂上这个Hook後,影响的层面不单是这个Process,而是

所有的Process,而这两Hook又不用写在Dll之中,所以很好用。


首先我们要知道由键盘和Mouse输入等的硬体讯息,会存到一个System Queue而後OS会

到该System Queue看有没有讯息在其中,若有则撷取出来,看目前Active的Window是谁

而将讯息Post给它。而挂上JournalRecord Hook时,当有讯息被撷取出来时,会先执行

我们所设定的Hook Function(在vb中,一定要放在.BAS档之中)。这可以做什麽事呢?

例如们可以Check整个系统是否有按了键盘或有没有移动Mouse(一般来说,KeyUp,KeyDown

, MouseMove等Event只有Form在Active 时才收得到,挂上JournalRecord hook後,执行

Hook的thread便能收到所有这些讯息)。再如,它既然能收到Keyboard、Mouse的讯息,那

便可以将收到的讯息记录起来(记录於Memory或Disk都可以),之後再依方才的顺序重新

将讯息放送出来,可重新执行方才的动作(这不就是巨集的作法吗),或许

它叫JournalRecord便是这个原因。再来便是播放记录讯息的问题了,如果一面播放,一

面有其他讯息插队(如移动Mouse),那就不对了,所以JournalPlayBack这个Hook它会

让Mouse、Keyboard都失效,当OS 要求读System Queue时,便会启动这个Hook,就在此

时,我们可以把方才记录起来的讯息丢出一个出来,OS再要求读System Queue时,再丢

下一个讯息,如此达重播的效果(所以才叫JournalPlayBack),正因它会让键盘、Mouse

失效,拿它来做导览、教学系统的自动Move Mouse或文字显示是最适合的了。


Mouse的自动导引系统制作方式,可参考如何自动移动Mouse


'以下在.Bas中

Declare Sub Sleep Lib "KERNEL32" (ByVal dwMilliseconds As Long)

Const WM_MOUSELAST = &H209

Const WM_MOUSEFIRST = &H200

Public Const WM_KEYLAST = &H108

Public Const WM_KEYFIRST = &H100

Public Const WH_JOURNALRECORD = 0

Public Const WH_JOURNALPLAYBACK = 1


Type EVENTMSG

message As Long

paramL As Long

paramH As Long

time As Long

hwnd As Long

End Type

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

Declare Function CallNextHookEx Lib "user32" (ByVal hHook As Long, _

ByVal nCode As Long, ByVal wParam As Long, lParam As Any) As Long

Public hNxtHook As Long ' handle of Hook Procedure

Public msg As EVENTMSG


Sub EnableHook()

hNxtHook = SetWindowsHookEx(WH_JOURNALPLAYBACK, AddressOf HookProc, App.hInstance, 0)

End Sub

Sub FreeHook()

Dim ret As Long

ret = UnhookWindowsHookEx(hNxtHook)

End Sub

Function HookProc(ByVal code As Long, ByVal wParam As Long, _

ByVal lParam As Long) As Long

HookProc = CallNextHookEx(hNxtHook, code, wParam, lParam)

End Function


'以下在Form中,需求:一个Command1, 一个text1

Private Sub Command1_Click()

Dim str5 As String, len5 As Long, i As Long


Call EnableHook

str5 = "这是一个测试JournalPlayBackHook的程式"

len5 = Len(str5)

For i = 1 To len5

Text1.Text = Mid(str5, 1, i)

Text1.Refresh

Sleep (200)

Next

Call FreeHook

End Sub
tabris17 2004-01-30
  • 打赏
  • 举报
回复
这篇文章写了很久没敢发表,就是由于最后的问题搞不定,那位高人友好办法告诉我一声,如果要在kernel-mod中解决的化就算了
loveisbug 2004-01-30
  • 打赏
  • 举报
回复
不知道
WnEunfn 2004-01-30
  • 打赏
  • 举报
回复
EnableWindow?
在指定的窗口里允许或禁止所有鼠标及键盘输入
bendou16 2004-01-30
  • 打赏
  • 举报
回复
tabris17(四不象),你的方法真的很不错,感谢

16,551

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Creator Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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