大家来研究一下这个能检测键盘插入的程序

时间:2022-02-08 00:35:18
这个程序能检测到键盘插入
在测试几个按键后,拔插键盘或插入新键盘都会重新复位
大家研究一下
VB能不能实现这个功能

找不到添加附件的地方只好放到网络硬盘了,地址:
http://u.xunzai.com/fileview_90433.html

13 个解决方案

#1


拔插键盘或插入新键盘----啥意思?

#2


LZ的键盘是USB的还是PS/2的?

#3


USB和PS2的都可以检测到
只要拔插一下键盘
或插入新的键盘
前面按过的按键,都可以重新复位

#4


高手快来指点一下呀

#5


大侠们快来看看

#6


估计USB的能实现,PS/2的怕是不行。

#7


经测试,USB设备插入与拔出时,会向所有*窗体投放wm_devicechange消息.

应该能从此消息中得到设备类型.

至于PS2设备,不清楚是否支持PNP,因为我是本本,没有此接口,无法测试.

测试很简单,大家硬件适合的也可以:

就是打开一个SPY++(这个应该都有吧),然后拦截任意一个程序的*窗体的消息(我又是使用可怜的记事本..)

#8


我用SPY++分几次拦载这个程序的窗口.以下是结果,请myjian帮忙分析一下
每次清0再继续下一步

第一次按任意键:
<00001> 000B0438 S WM_WINDOWPOSCHANGING lpwp:0012FC90
<00002> 000B0438 R WM_WINDOWPOSCHANGING
<00003> 000B0438 S WM_WINDOWPOSCHANGING lpwp:0012FC90
<00004> 000B0438 R WM_WINDOWPOSCHANGING
<00005> 000B0438 S WM_WINDOWPOSCHANGING lpwp:0012FC90
<00006> 000B0438 R WM_WINDOWPOSCHANGING
<00007> 000B0438 S WM_WINDOWPOSCHANGING lpwp:0012FC90
<00008> 000B0438 R WM_WINDOWPOSCHANGING

第二次拔插PS2键盘:(注,拔的时候没有收到任何消息)
<00001> 000B0438 S WM_WINDOWPOSCHANGING lpwp:0012FC5C
<00002> 000B0438 R WM_WINDOWPOSCHANGING
<00003> 000B0438 S WM_WINDOWPOSCHANGING lpwp:0012FC5C
<00004> 000B0438 R WM_WINDOWPOSCHANGING
......
<00047> 000B0438 S WM_WINDOWPOSCHANGING lpwp:0012FC5C
<00048> 000B0438 R WM_WINDOWPOSCHANGING

第三次拔插USB键盘:
1.插入
<00001> 000B0438 P WM_DEVICECHANGE Event:0007 dwData:00000000
<00002> 000B0438 P WM_DEVICECHANGE Event:0007 dwData:00000000
......
<00009> 000B0438 P WM_DEVICECHANGE Event:0007 dwData:00000000
<00010> 000B0438 S WM_DEVICECHANGE Event:DBT_DEVICEARRIVAL dwData:0015A9F8
<00011> 000B0438 S .WM_WINDOWPOSCHANGING lpwp:0012F8D0
<00012> 000B0438 R .WM_WINDOWPOSCHANGING
<00013> 000B0438 S .WM_WINDOWPOSCHANGING lpwp:0012F8D0
<00014> 000B0438 R .WM_WINDOWPOSCHANGING
......
<00057> 000B0438 S .WM_WINDOWPOSCHANGING lpwp:0012F8D0
<00058> 000B0438 R .WM_WINDOWPOSCHANGING
<00059> 000B0438 R WM_DEVICECHANGE fComplete:True
<00060> 000B0438 P WM_DEVICECHANGE Event:0007 dwData:00000000
<00061> 000B0438 S WM_DEVICECHANGE Event:DBT_DEVICEARRIVAL dwData:0014AA18
<00062> 000B0438 R WM_DEVICECHANGE fComplete:True
<00063> 000B0438 P WM_DEVICECHANGE Event:0007 dwData:00000000
<00064> 000B0438 S WM_DEVICECHANGE Event:DBT_DEVICEARRIVAL dwData:0014AA18
<00065> 000B0438 R WM_DEVICECHANGE fComplete:True
<00066> 000B0438 P WM_DEVICECHANGE Event:0007 dwData:00000000

2拔出:
<00067> 000B0438 P WM_DEVICECHANGE Event:0007 dwData:00000000
<00068> 000B0438 S WM_DEVICECHANGE Event:DBT_DEVICEARRIVAL dwData:0014AA18
<00069> 000B0438 R WM_DEVICECHANGE fComplete:True
<00070> 000B0438 S WM_DEVICECHANGE Event:DBT_DEVICEARRIVAL dwData:0014AA18
<00071> 000B0438 R WM_DEVICECHANGE fComplete:True
<00072> 000B0438 P WM_DEVICECHANGE Event:0007 dwData:00000000
<00073> 000B0438 S WM_DEVICECHANGE Event:DBT_DEVICEARRIVAL dwData:00167650
<00074> 000B0438 R WM_DEVICECHANGE fComplete:True
<00075> 000B0438 P WM_DEVICECHANGE Event:0007 dwData:00000000
<00076> 000B0438 P WM_DEVICECHANGE Event:0007 dwData:00000000
<00077> 000B0438 P WM_DEVICECHANGE Event:0007 dwData:00000000
<00078> 000B0438 P WM_DEVICECHANGE Event:0007 dwData:00000000

#9


大家可以试一下
别人已经实现了这一功能
问题是我们用VB能不能实现

#10


你现在应该先关注"怎么样实现",再去想"能不能用VB实现".

先搞清楚原理再说.

如果这仅仅是SDK编程,都调用API的话,VB完不成的还不是很多.

#11


别人已经实现了这个功能。
现在就是搞不清楚原理,所以我没办法实现这个功能。
再加上现在捕捉到的消息也不全
因为程序加入了钩子,已经把一些消息吃掉了。
没什么头绪了

#12


顶一下

#13


既然你已经知道是用了钩子,那还问VB。VB不能做钩子。
用VC吧。另外PS/2接口不支持热插拔。
原理就是用钩子监测相应的中断。

#1


拔插键盘或插入新键盘----啥意思?

#2


LZ的键盘是USB的还是PS/2的?

#3


USB和PS2的都可以检测到
只要拔插一下键盘
或插入新的键盘
前面按过的按键,都可以重新复位

#4


高手快来指点一下呀

#5


大侠们快来看看

#6


估计USB的能实现,PS/2的怕是不行。

#7


经测试,USB设备插入与拔出时,会向所有*窗体投放wm_devicechange消息.

应该能从此消息中得到设备类型.

至于PS2设备,不清楚是否支持PNP,因为我是本本,没有此接口,无法测试.

测试很简单,大家硬件适合的也可以:

就是打开一个SPY++(这个应该都有吧),然后拦截任意一个程序的*窗体的消息(我又是使用可怜的记事本..)

#8


我用SPY++分几次拦载这个程序的窗口.以下是结果,请myjian帮忙分析一下
每次清0再继续下一步

第一次按任意键:
<00001> 000B0438 S WM_WINDOWPOSCHANGING lpwp:0012FC90
<00002> 000B0438 R WM_WINDOWPOSCHANGING
<00003> 000B0438 S WM_WINDOWPOSCHANGING lpwp:0012FC90
<00004> 000B0438 R WM_WINDOWPOSCHANGING
<00005> 000B0438 S WM_WINDOWPOSCHANGING lpwp:0012FC90
<00006> 000B0438 R WM_WINDOWPOSCHANGING
<00007> 000B0438 S WM_WINDOWPOSCHANGING lpwp:0012FC90
<00008> 000B0438 R WM_WINDOWPOSCHANGING

第二次拔插PS2键盘:(注,拔的时候没有收到任何消息)
<00001> 000B0438 S WM_WINDOWPOSCHANGING lpwp:0012FC5C
<00002> 000B0438 R WM_WINDOWPOSCHANGING
<00003> 000B0438 S WM_WINDOWPOSCHANGING lpwp:0012FC5C
<00004> 000B0438 R WM_WINDOWPOSCHANGING
......
<00047> 000B0438 S WM_WINDOWPOSCHANGING lpwp:0012FC5C
<00048> 000B0438 R WM_WINDOWPOSCHANGING

第三次拔插USB键盘:
1.插入
<00001> 000B0438 P WM_DEVICECHANGE Event:0007 dwData:00000000
<00002> 000B0438 P WM_DEVICECHANGE Event:0007 dwData:00000000
......
<00009> 000B0438 P WM_DEVICECHANGE Event:0007 dwData:00000000
<00010> 000B0438 S WM_DEVICECHANGE Event:DBT_DEVICEARRIVAL dwData:0015A9F8
<00011> 000B0438 S .WM_WINDOWPOSCHANGING lpwp:0012F8D0
<00012> 000B0438 R .WM_WINDOWPOSCHANGING
<00013> 000B0438 S .WM_WINDOWPOSCHANGING lpwp:0012F8D0
<00014> 000B0438 R .WM_WINDOWPOSCHANGING
......
<00057> 000B0438 S .WM_WINDOWPOSCHANGING lpwp:0012F8D0
<00058> 000B0438 R .WM_WINDOWPOSCHANGING
<00059> 000B0438 R WM_DEVICECHANGE fComplete:True
<00060> 000B0438 P WM_DEVICECHANGE Event:0007 dwData:00000000
<00061> 000B0438 S WM_DEVICECHANGE Event:DBT_DEVICEARRIVAL dwData:0014AA18
<00062> 000B0438 R WM_DEVICECHANGE fComplete:True
<00063> 000B0438 P WM_DEVICECHANGE Event:0007 dwData:00000000
<00064> 000B0438 S WM_DEVICECHANGE Event:DBT_DEVICEARRIVAL dwData:0014AA18
<00065> 000B0438 R WM_DEVICECHANGE fComplete:True
<00066> 000B0438 P WM_DEVICECHANGE Event:0007 dwData:00000000

2拔出:
<00067> 000B0438 P WM_DEVICECHANGE Event:0007 dwData:00000000
<00068> 000B0438 S WM_DEVICECHANGE Event:DBT_DEVICEARRIVAL dwData:0014AA18
<00069> 000B0438 R WM_DEVICECHANGE fComplete:True
<00070> 000B0438 S WM_DEVICECHANGE Event:DBT_DEVICEARRIVAL dwData:0014AA18
<00071> 000B0438 R WM_DEVICECHANGE fComplete:True
<00072> 000B0438 P WM_DEVICECHANGE Event:0007 dwData:00000000
<00073> 000B0438 S WM_DEVICECHANGE Event:DBT_DEVICEARRIVAL dwData:00167650
<00074> 000B0438 R WM_DEVICECHANGE fComplete:True
<00075> 000B0438 P WM_DEVICECHANGE Event:0007 dwData:00000000
<00076> 000B0438 P WM_DEVICECHANGE Event:0007 dwData:00000000
<00077> 000B0438 P WM_DEVICECHANGE Event:0007 dwData:00000000
<00078> 000B0438 P WM_DEVICECHANGE Event:0007 dwData:00000000

#9


大家可以试一下
别人已经实现了这一功能
问题是我们用VB能不能实现

#10


你现在应该先关注"怎么样实现",再去想"能不能用VB实现".

先搞清楚原理再说.

如果这仅仅是SDK编程,都调用API的话,VB完不成的还不是很多.

#11


别人已经实现了这个功能。
现在就是搞不清楚原理,所以我没办法实现这个功能。
再加上现在捕捉到的消息也不全
因为程序加入了钩子,已经把一些消息吃掉了。
没什么头绪了

#12


顶一下

#13


既然你已经知道是用了钩子,那还问VB。VB不能做钩子。
用VC吧。另外PS/2接口不支持热插拔。
原理就是用钩子监测相应的中断。