关于Hook
可不可以用HOOK来检测光驱里面是否有盘?如果可以该怎样实现? 问题点数:100、回复次数:15Top
1 楼AprilSong(X)回复于 2004-12-01 00:35:49 得分 1
这个可以不用Hook吧~Top
2 楼AprilSong(X)回复于 2004-12-01 00:44:30 得分 1
比如这样~
Private Sub Form_Click()
If TestDrive("j:") Then
MsgBox "有盘"
Else
MsgBox "无盘"
End If
End Sub
Private Function TestDrive(Drive As String) As Boolean
On Error Resume Next
Dir Drive
TestDrive = (Err.Number = 0)
Err.Clear
End FunctionTop
3 楼homezj(小吉)回复于 2004-12-01 01:52:43 得分 1
用HOOK来检测光驱里面何时放入或取出光盘倒有点像!而检测是否有盘,则有点文不对题,刚才发现“多线程”是个时髦的词,看来现在“Hook”也是了。Top
4 楼achinacracker()回复于 2004-12-01 12:07:49 得分 0
不是:
Private Sub Form_Click()
If TestDrive("j:") Then
MsgBox "有盘"
Else
MsgBox "无盘"
End If
End Sub
而是随时检测Top
5 楼myjian(嗷嗷叫的老马--很不顺.....最近.....很不顺.........)回复于 2004-12-01 21:47:23 得分 1
http://community.csdn.net/Expert/TopicView1.asp?id=3403601
看看这个吧.人家是早发了的了,不过好像还没有解决的办法.Top
6 楼happy_sea(开心海(数据读取中,请稍候......))回复于 2004-12-01 21:58:25 得分 1
思路:
1、确定光驱的盘符;
2、
Private Sub Command1_Click()
On Error GoTo NoDisk
If Dir("h:\*.*") <> "" Then MsgBox "有盘!"
Exit Sub
NoDisk:
MsgBox "无盘!"
End Sub
Top
7 楼happy_sea(开心海(数据读取中,请稍候......))回复于 2004-12-01 22:00:14 得分 1
以上假定光驱盘符为H,用Dir命令如果出错说明无盘,反之有盘。Top
8 楼achinacracker()回复于 2004-12-01 23:58:04 得分 0
我不管门开没看,我只是想随时检测光驱,看里面有没有光盘,不想用TIMER控件Top
9 楼myjian(嗷嗷叫的老马--很不顺.....最近.....很不顺.........)回复于 2004-12-06 00:13:38 得分 1
开心海朋友,建议先看一下我发的那个地址!那里面已经讨论得相当清楚了!!Top
10 楼happy_sea(开心海(数据读取中,请稍候......))回复于 2004-12-06 09:32:59 得分 1
“检测光驱里面是否有盘”,这跟仓门关没关有啥关系?当然是关着的时候了,如果门开着这个问题还有意义吗?开着的时候还要检测,恐怕要在光驱托盘上加个计重装置吧,晕!Top
11 楼happy_sea(开心海(数据读取中,请稍候......))回复于 2004-12-06 09:38:19 得分 1
另外,门开着跟没有盘这两种情况对你的要求来说,有什么差别吗?Top
12 楼happy_sea(开心海(数据读取中,请稍候......))回复于 2004-12-06 09:40:18 得分 0
不过,要想实现实时检测倒不是一件容易的事。。。Top
13 楼achinacracker()回复于 2004-12-06 13:33:37 得分 0
他的问题是:判断光驱门是开还是关
但我只管光驱门关着的时候里面有没有光盘Top
14 楼HtoFire(冬天里的一把火)回复于 2004-12-16 16:45:01 得分 1
Hook不是万能的,这个好像Hook也办不到吧。Top
15 楼fanzai(帆仔)回复于 2004-12-17 05:54:01 得分 90
当程序刚刚运行的时候,肯定要直接检查一下管区是否有盘。前面几位老兄已经说了直接的方法,主要就是用dir来判断。
关键是程序运行后,怎样不通过timer实现及时地知道什么时候可能有盘进入。下面的程序可以实现!
在模块中写入:
Public Const GWL_WNDPROC = (-4)
Public Const WM_DEVICECHANGE As Long = &H219
Public Declare Function SetWindowLong Lib "user32.dll" Alias "SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
Public Declare Function CallWindowProc Lib "user32.dll" Alias "CallWindowProcA" (ByVal lpPrevWndFunc As Long, ByVal hwnd As Long, ByVal msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Public lpPrevWndProc As Long
Function WindowProc(ByVal hw As Long, ByVal uMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
If uMsg = WM_DEVICECHANGE Then
If wParam And 4 Then
MsgBox "光驱打开了!肯定没盘!"
Else
MsgBox "光驱关上了,有待检查!"
End If
End If
WindowProc = CallWindowProc(lpPrevWndProc, hw, uMsg, wParam, lParam)
End Function
在窗体中写入:
Private Sub Form_Load()
lpPrevWndProc = SetWindowLong(Me.hwnd, GWL_WNDPROC, AddressOf WindowProc)
End Sub
Private Sub Form_Unload(Cancel As Integer)
SetWindowLong Me.hwnd, GWL_WNDPROC, lpPrevWndProc
End Sub
Top




