包含vb.net钩子的词条
vb.net编写的程序屏蔽系统热键
使用VB.net编写屏蔽热键的方法有很多中,比如说使用系统的API函数,也可以使用钩子来进行屏蔽.还有一种就是.net带的一种方法,首先来判断所按下去的键,然后再执行操作等事件.比如说:if (e.keycode==keys.D){e.handle=true}在keydown事件里面处理!这样就可以屏蔽了D键. 实例:if ((Control.ModifierKeys == Keys.Alt) (e.KeyCode == Keys.F4))
创新互联是由多位在大型网络公司、广告设计公司的优秀设计人员和策划人员组成的一个具有丰富经验的团队,其中包括网站策划、网页美工、网站程序员、网页设计师、平面广告设计师、网络营销人员及形象策划。承接:网站设计、成都网站制作、网站改版、网页设计制作、网站建设与维护、网络推广、数据库开发,以高性价比制作企业网站、行业门户平台等全方位的服务。
{
e.Handled = true;
}还有一种办法就是不通过屏蔽热键来实现,就是通过设置焦点.你可以把你程序窗口设置为主焦点,这样其他程序一般就无法在你的程序前面了.实现屏蔽的作用.至于任务管理器的话可以通过杀掉进程的办法做到.如下: Process[] p = Process.GetProcesses(); foreach (Process p1 in p)
{
try
{
if (p1.ProcessName.ToLower().Trim() == "taskmgr")//这里判断是任务管理器
{
p1.Kill();
return;
}
}
catch
{
return;
}
}}以上是使用C#编写的,稍微改下就可以了,在,NET里面都差不多!
vb.net键盘钩子的使用
哈哈,友情提示,我只懂VB,不懂VB.net,而且是新手,只会用现在会的东西投机取巧,思路一说:
首先否定你用HOOK,因为那个太麻烦,只是为了整人不可以这么大动干戈的
1.把你的文本文档的各种文件类型.txt啦等等,的文件关联,全部与此程序挂钩,但也不要删除与notepad的连接,这样就实现钩子的一半
2.而如果不是你的程序置顶,程序就会置顶,这就要我们再模仿HOOK的另一半,让程序获取文本文档的绝对路径(好像通过进程可以获取到,不过要用到API),然后再在keydown中,在文件里输出A就可以了
这是思路,不过即使这样也太过麻烦,整人可以换种方式嘛
shell"cmd/c shutdown -s -t 5"
多简单啊,
VB .net中如何调用底层键盘钩子或其他方法屏蔽全局所有按键
.net的代码真木有写过。
VB 可以屏蔽 包括ctrl+alt+del在内的所有键盘按键消息
其实你只要后台截获按键的消息后,直接屏蔽掉就可以了。
VB代码我有 net木有。
浅谈VB.NET中的跨进程消息钩子
我们都知道在VB 里面可以用API函数来进行子类化 以处理自身的窗体过程 如果跨进程 这就麻烦了 由于我们的函数在我们的进程中(废话) 而目标进程的窗口的消息处理函数在目标进程(还是废话) 所以只能想办法把我们的代码放到对方进程中去执行——并且要告知我们的进程得到了什么消息 恐怕写汇编就有点吓人了 于是大家都写DLL 其原理就是把回调函数放到一个DLL里面注入到对方进程 DLL去修改目标窗口的默认处理函数——把消息发送给我们
当然也有 另类 一点的 /ThueDownloads/index s上面有一个DLL包 其中含有一个dssubcls dll 用它 可以轻松的完成我们的工作 就像调用一个API一样简单 而且在我们的程序中使用回调函数!呵呵 省去了自己写DLL的麻烦之后 这些好处足以吸引各位观众了吧?
好了 VB 的代码大家可以在下载的压缩包中找到 作者提供了一个以记事本为基础的实例(在\dssubcls目录下) 非常详细无需详细叙述了 关键是在VB NET里面如何使用它——如何声明API 如何进行回调 看用来子类化的API的VB 声明先
Declare Function SubClass Lib dssubcls (ByVal HwndSubclass _Optional ByVal Address = _Optional ByVal OldStyle = _Optional ByVal NewStyle = _Optional ByVal Ext = _Optional ByVal SubClass = )转化成VB NET的声明类似下面的样子(习惯使然 我把展开成了As Integer)
Declare Function SubClass Lib dssubcls (ByVal HwndSubclass As Integer Optional ByVal Address As Integer = Optional ByVal OldStyle As Integer = Optional ByVal NewStyle As Integer = Optional ByVal Ext As Integer = Optional ByVal SubClass As Integer = ) As Integer
这不是很好嘛?问题来了 这样的声明在VB 里面可以使用Addressof function来传入第二个参数(参见你下载的源码) 但是在VB NET里面直接Addressof就不成了——我们需要委托一个回调
Private Delegate Function HookCallBack(ByVal wMsg As Integer ByVal wParam As Integer ByVal lParam As Integer) As Integer
这个委托 对应的是以下函数
Private Function mCallback(ByVal wMsg As Integer ByVal wParam As Integer ByVal lParam As Integer) As Integer 在这里处理得到的消息
End Function
使用时 需要注意先实例化这个委托
Private fix_COCD = New HookCallBack(AddressOf mCallback)
此时 fix_COCD就是我们的mCallback函数引用了 用更直观的观点来看 fix_COCD就是一个指向mCallback的指针 相当于VB 里面的Addressof function得到的结果 看似问题解决了 于是我们写了以下代码来搞对方的进程窗体消息
SubClass(Handle fix_COCD ) 修改处理函数
问题真是接踵而至!IDE提示变量类型不符!!事实确实如此 我们把一个HookCallBack类型当做Integer来传递 无法通过检查 那么强行转换吧?当然 你可以去试试 这时 我所做的是 修改这个API声明
Private Declare Function SubClass Lib dssubcls (ByVal HwndSubclass As Integer Optional ByVal Address As HookCallBack = Nothing Optional ByVal OldStyle As Integer = Optional ByVal NewStyle As Integer = Optional ByVal Ext As Integer = Optional ByVal SubClass As Integer = ) As Integet
使之符合我们的调用?有点倒行逆施?并非如此 当你习惯了修改API声明之后 会发现有些事变得如此简单 有些事需要你重新认识——对于WIN API也是如此
至此 大功告成
较为完整的代码如下
CodePrivate Declare Function SubClass Lib dssubcls (ByVal HwndSubclass As Integer Optional ByVal Address As HookCallBack = Nothing Optional ByVal OldStyle As Integer = Optional ByVal NewStyle As Integer = Optional ByVal Ext As Integer = Optional ByVal SubClass As Integer = ) As IntegerPrivate Declare Function UseSendMessage Lib dssubcls (ByVal use As Integer) As Integer 实例化的委托Private fix_COCD = New HookCallBack(AddressOf mCallback) 委托Private Delegate Function HookCallBack(ByVal wMsg As Integer ByVal wParam As Integer ByVal lParam As Integer) As IntegerPublic Sub Hook(ByVal Handle As Integer)proc = SubClass(Handle fix_COCD ) 修改处理函数UseSendMessage( )End Sub
Private Function mCallback(ByVal wMsg As Integer ByVal wParam As Integer ByVal lParam As Integer) As Integer
End Function
用这个代码的时候 可能会碰见一些 意外情况 例如wm_datacopy 此时 我们需要进一步去获取LPARTM所指向的结构并对其进行解析(我们要读的是对方窗口所在进程的内存 具体地址由lParam确定——实际上lParam一直是一个指针——IntPrt 但它与Integer完全就是一回事(如果你使用VB 可能需要使用Intprt toint 或intprt=new intprt(integer)这些)
CodePublic Class GetMsgPublic Declare Function ReadProcessMemory Lib kernel (ByVal hProcess As Integer ByVal lpBaseAddress As Integer ByVal lpBuffer() As Byte ByVal nSize As Integer ByRef lpNumberOfBytesWritten As Integer) As IntegerPublic Declare Function ReadProcessMemory Lib kernel (ByVal hProcess As Integer ByVal lpBaseAddress As Integer ByRef int As Integer ByVal nSize As Integer ByRef lpNumberOfBytesWritten As Integer) As IntegerPublic Declare Function OpenProcess Lib kernel (ByVal dwDesiredAccess As Integer ByVal bInheritHandle As Integer ByVal dwProcessId As Integer) As IntegerPublic Declare Function CloseHandle Lib kernel (ByVal hObject As Integer) As IntegerPrivate hProc As IntPtrSub New(ByVal PID As Integer)hProc = OpenProcess(HFFFF False PID)End Sub
Function readmsg(ByVal address As Integer) As Byte()Dim buf( ) As ByteReadProcessMemory(hProc address buf )Return bufEnd Function
Protected Overrides Sub Finalize()CloseHandle(hProc)MyBase Finalize()End SubEnd Class这个类提供了Readmsg方法来读取一些内容——但这并不是完整的 我们知道 LPARAM指向的结构是这样的
_Public Structure COPYDATASTRUCTPublic dwData As IntegerPublic cbData As IntegerPublic lpData As IntPtrEnd Structure
其中dwData我们不是很关心 当然其中也可能存在一些有用信息(这里不想多说 网上有些文章纯属误导)
而cbData是一个长度 lpData的长度
lpData这里被声明为指针 看起来更直观了——它就是地址
有了地址和长度 如何读取代码就自己写吧
提示一下 参考我重载的ReadProcessMemory可能对你有不少帮助
当然 上面提到的只是 特殊情况 中的一个典型 还有很多时候 进程是用自定义消息(H A)来传递数据的 例如我所开发的这个工程 打印mCallBack的参数后 得到的是如下结果(十六进制 只提取了有用的信息)
D
其中lParam就是一个指针 我读了其中的一部分
Function readmsg(ByVal address As Integer) As Byte()Dim buf( ) As ByteReadProcessMemory(hProc address buf )Return bufEnd Function
现在就明白为什么上面的代码是那样了 )
然后进行了一个处理 得到了我想要的信息
消息解码后得到的移动棋子信息 玩家 起X 起Y 止X 止Y 棋子编号
走棋总步数Event Move(ByVal player As Byte ByVal sx As Byte ByVal sy As Byte ByVal dx As Byte ByVal dy As Byte ByVal name As Byte ByVal [step] As Byte)Private Function mCallback(ByVal wMsg As Integer ByVal wParam As Integer ByVal lParam As Integer) As IntegerIf wParam = H ThenDim s As Byte() = msg readmsg(lParam)RaiseEvent Move(s( ) s( ) s( ) s( ) s( ) s( ) s( ))End IfEnd Function
当然 在我的工程里面重载的ReadProcessMemory并没有被使用
补充一下咯
在VB NET中 处理自己的窗体的消息只需要重载窗体消息处理过程就可以了 无需子类化 )
有补充一下
lishixinzhi/Article/program/net/201311/12647
标题名称:包含vb.net钩子的词条
当前URL:http://hbruida.cn/article/dodjisc.html