我们知道,要使程序在用户按下鼠标或键盘时作出响应,可以用以下的两个事件:
Private Sub Form_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single) '鼠标按下
……
End SubPrivate Sub Form_KeyDown(KeyCode As Integer, Shift As Integer) '键盘按下
……
End Sub
但是,这两个事件只对调用他的程序作出响应,而不能对其他程序中的鼠标或键盘的键按下作出响应。例如,myform是我们自己编制的软件,在myform中调用了这两个事件,当myform为当前运行的程序,用户在myform中按下了鼠标或键盘时,myform响应这两个事件,这是勿用置疑的;但是,如果myform不是当前运行的程序,当前运行的应用程序是word或excel等其公司制作的软件,用户在word或excel中按下了鼠标或键盘时,myform中的那两个事件便不会作出响应了。现在我的问题是:如何捕获在其他程序中的鼠标按下与键盘按下事件呢?换句说,就是怎样实现在当用户在WORD或EXCEL等其他程序中按下鼠标或键盘时,我们自己的软件myform也能作出响应呢?(可以用API函数解决吗?)
Private Sub Form_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single) '鼠标按下
……
End SubPrivate Sub Form_KeyDown(KeyCode As Integer, Shift As Integer) '键盘按下
……
End Sub
但是,这两个事件只对调用他的程序作出响应,而不能对其他程序中的鼠标或键盘的键按下作出响应。例如,myform是我们自己编制的软件,在myform中调用了这两个事件,当myform为当前运行的程序,用户在myform中按下了鼠标或键盘时,myform响应这两个事件,这是勿用置疑的;但是,如果myform不是当前运行的程序,当前运行的应用程序是word或excel等其公司制作的软件,用户在word或excel中按下了鼠标或键盘时,myform中的那两个事件便不会作出响应了。现在我的问题是:如何捕获在其他程序中的鼠标按下与键盘按下事件呢?换句说,就是怎样实现在当用户在WORD或EXCEL等其他程序中按下鼠标或键盘时,我们自己的软件myform也能作出响应呢?(可以用API函数解决吗?)
建议:
做一个client--sever,其中,①可以查看的结束掉client的所有的进程或者是限制其进程的运行.②可以截取client的屏幕. 有了这两个大概就可以了哦.呵呵~~~
无论晴天也好,雨天也好,我希望和你一起度过~~~~~~~~风笛~~~~~~~
做一个client--sever,其中,①可以查看的结束掉client的所有的进程或者是限制其进程的运行.②可以截取client的屏幕. 有了这两个大概就可以了哦.呵呵~~~”
——————————————————————————————————————
zixing,你的建议很好,我现在就是做成“客户机——服务器”模式的。你提到“②可以截取client的屏幕”,怎样实现这个功能呢?
每个station都运行你写的client,然后定时把系统中正在运行的程序列表发给你的server,你在server端监视.
有必要象你所说的去控制他们的行为吗?
关于上网的问题,我想还是叫proxy server去处理吧,那样会好的多.
如果硬要用VB的话:'新建一个窗口,把下面内容粘进去
Private Sub Form_Load()
hHook = SetWindowsHookEx(WH_JOURNALRECORD, AddressOf HookProc, App.hInstance, 0)
End SubPrivate Sub Form_Unload(Cancel As Integer)
UnhookWindowsHookEx hHook
End Sub
'----------------------------'新建一个模块,把下面内容粘进去
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 UnhookWindowsHookEx Lib "user32" (ByVal hHook 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 LongPublic Const WH_KEYBOARD = 2
Public Const WH_MOUSE = 7
Public Const WH_JOURNALRECORD = 0Public Type EVENTMSG
message As Long
paramL As Long
paramH As Long
time As Long
hwnd As Long
End Type
Public Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long)Public hHook As Long
Public msg As EVENTMSGPublic Function HookProc(ByVal nCode As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
CopyMemory msg, lParam, Len(msg)
Debug.Print msg.hwnd, msg.message, msg.paramH, msg.paramL, msg.time
HookProc = CallNextHookEx(hHook, nCode, wParam, lParam)
End Function
用VC写DLL做全局钩子,不过挺麻烦的