又一篇。写写回调。研究了N小时,结果就这么几句。。怒!
先帖VB6写的这个回调:
模块:
Declare Function SetTimer Lib "user32" (ByVal hwnd As Long, ByVal nIDEvent As Long, ByVal uElapse As Long, ByVal lpTimerFunc As Long) As Long
'回调函数
Sub TimerProc(ByVal hwnd As Long, ByVal nIDEvent As Long, ByVal uElapse As Long, ByVal lpTimerFunc As Long)
'在这里实现要的操作,不过想操作窗体里的东西就不好办,据说VB6的回调只能在模块里,那想实现事件啥的,就麻烦了,需要关联到现成的控件..NET里面就没那么麻烦了.(这是我看到的唯一的好处)
End Sub
'窗体
SetTimer 0, 0, 1, AddressOf TimerProc (注意AddressOf 的位置:这个位置将对应API函数的修改位置: ByVal lpTimerFunc As SetTimerProc,而Delegate 的定义方式是与原API完全相同的,只是返回值改为Boolean)
这就可以了
换到.NET里面,好像得托管还是非托管,名词俺们不懂,要代码来重用就行了,不是吗?
类的实现:
public class Test
Private Delegate Function SetTimerProc(ByVal hwnd As Integer, ByVal nIDEvent As Integer, ByVal uElapse As Integer, ByVal lpTimerFunc As Integer) As Boolean
Private ST As New SetTimerProc(AddressOf TimerProc)
Private Declare Function SetTimer Lib "user32" (ByVal hwnd As Integer, ByVal nIDEvent As Integer, ByVal uElapse As Integer, ByVal lpTimerFunc As SetTimerProc) As Integer
Private Function TimerProc(ByVal hwnd As Integer, ByVal nIDEvent As Integer, ByVal uElapse As Integer, ByVal lpTimerFunc As Integer) As Boolean
'这里就写你的操作即可.实际上我是在这里实现了全局热键和定时器,把定时器写在这里
End Function
'以上这些就实现了这个回调
end class
若想实现事件,就可以在类的开头写入事件:
Public Event Tick(ByVal KeyState As Integer)
然后在Private Function TimerProc里面添加如下代码
RaiseEvent Tick(thenTime)
就可以实现了,当然了,具体实现代码自己写吧.
调用时这样写:
Private WithEvents KeyPass As new Test
然后窗体里就可以使用这个事件了