vb.net 全局键盘钩子?

问题描述

这段键盘钩子,在窗口里怎么调用啊?ImportsSystem.Reflection,System.Threading,System.ComponentModel,System.Runtime.InteropServices'''<summary>本类可以在.NET环境下使用系统键盘与鼠标钩子</summary>PublicClassSystemHook定义结构API声明导入常量声明事件委托处理PrivatehMouseHookAsIntegerPrivatehKeyboardHookAsIntegerPrivateSharedMouseHookProcedureAsHookProcPrivateSharedKeyboardHookProcedureAsHookProc创建与析构类型'''<summary>开始安装系统钩子</summary>'''<paramname="InstallKeyboardHook">挂钩键盘消息</param>'''<paramname="InstallMouseHook">挂钩鼠标消息</param>PublicSubStartHook(OptionalByValInstallKeyboardHookAsBoolean=True,OptionalByValInstallMouseHookAsBoolean=False)'注册键盘钩子IfInstallKeyboardHookAndAlsohKeyboardHook=0ThenKeyboardHookProcedure=NewHookProc(AddressOfKeyboardHookProc)hKeyboardHook=SetWindowsHookEx(WH_KEYBOARD_LL,KeyboardHookProcedure,Marshal.GetHINSTANCE(Assembly.GetExecutingAssembly.GetModules()(0)),0)IfhKeyboardHook=0Then'检测是否注册完成UnHook(True,False)'在这里反注册ThrowNewWin32Exception(Marshal.GetLastWin32Error)'报告错误EndIfEndIf'注册鼠标钩子IfInstallMouseHookAndAlsohMouseHook=0ThenMouseHookProcedure=NewHookProc(AddressOfMouseHookProc)hMouseHook=SetWindowsHookEx(WH_MOUSE_LL,MouseHookProcedure,Marshal.GetHINSTANCE(Assembly.GetExecutingAssembly.GetModules()(0)),0)IfhMouseHook=0ThenUnHook(False,True)ThrowNewWin32Exception(Marshal.GetLastWin32Error)EndIfEndIfEndSub'''<summary>立刻卸载系统钩子</summary>'''<paramname="UninstallKeyboardHook">卸载键盘钩子</param>'''<paramname="UninstallMouseHook">卸载鼠标钩子</param>'''<paramname="ThrowExceptions">是否报告错误</param>PublicSubUnHook(OptionalByValUninstallKeyboardHookAsBoolean=True,OptionalByValUninstallMouseHookAsBoolean=True,OptionalByValThrowExceptionsAsBoolean=False)'卸载键盘钩子IfhKeyboardHook<>0AndAlsoUninstallKeyboardHookThenDimretKeyboardAsInteger=UnhookWindowsHookEx(hKeyboardHook)hKeyboardHook=0IfThrowExceptionsAndAlsoretKeyboard=0Then'如果出现错误,是否报告错误ThrowNewWin32Exception(Marshal.GetLastWin32Error)'报告错误EndIfEndIf'卸载鼠标钩子IfhMouseHook<>0AndAlsoUninstallMouseHookThenDimretMouseAsInteger=UnhookWindowsHookEx(hMouseHook)hMouseHook=0IfThrowExceptionsAndAlsoretMouse=0ThenThrowNewWin32Exception(Marshal.GetLastWin32Error)EndIfEndIfEndSub'键盘消息的委托处理代码PrivateFunctionKeyboardHookProc(ByValnCodeAsInteger,ByValwParamAsInteger,ByVallParamAsIntPtr)AsIntegerStatichandledAsBoolean:handled=FalseIfnCode>=0AndAlso(events("KeyDown")IsNotNothingOrElseevents("KeyPress")IsNotNothingOrElseevents("KeyUp")IsNotNothing)ThenStaticMyKeyboardHookStructAsKeyboardHookStructMyKeyboardHookStruct=DirectCast(Marshal.PtrToStructure(lParam,GetType(KeyboardHookStruct)),KeyboardHookStruct)'激活KeyDownIfwParam=WM_KEYDOWNOrElsewParam=WM_SYSKEYDOWNThen'如果消息为按下普通键或系统键DimeAsNewKeyEventArgs(MyKeyboardHookStruct.vkCode)RaiseEventKeyDown(Me,e)'激活事件handled=handledOre.Handled'是否取消下一个钩子EndIf'激活KeyUpIfwParam=WM_KEYUPOrElsewParam=WM_SYSKEYUPThenDimeAsNewKeyEventArgs(MyKeyboardHookStruct.vkCode)RaiseEventKeyUp(Me,e)handled=handledOre.HandledEndIf'激活KeyPress(TODO:此段代码还有BUG!)IfwParam=WM_KEYDOWNThenDimisDownShiftAsBoolean=(GetKeyState(VK_SHIFT)&&H80=&H80)DimisDownCapslockAsBoolean=(GetKeyState(VK_CAPITAL)<>0)DimkeyState(256)AsByteGetKeyboardState(keyState)DiminBuffer(2)AsByteIfToAscii(MyKeyboardHookStruct.vkCode,MyKeyboardHookStruct.ScanCode,keyState,inBuffer,MyKeyboardHookStruct.Flags)=1ThenStatickeyAsChar:key=Chr(inBuffer(0))'BUG所在'IfisDownCapslockXorisDownShiftAndChar.IsLetter(key)Then'key=Char.ToUpper(key)'EndIfDimeAsNewKeyPressEventArgs(key)RaiseEventKeyPress(Me,e)handled=handledOre.HandledEndIfEndIf'取消或者激活下一个钩子IfhandledThenReturn1ElseReturnCallNextHookEx(hKeyboardHook,nCode,wParam,lParam)EndIfEndFunction'鼠标消息的委托处理代码PrivateFunctionMouseHookProc(ByValnCodeAsInteger,ByValwParamAsInteger,ByVallParamAsIntPtr)AsIntegerIfnCode>=0AndAlsoevents("MouseActivity")IsNotNothingThenStaticmouseHookStructAsMouseLLHookStructmouseHookStruct=DirectCast(Marshal.PtrToStructure(lParam,GetType(MouseLLHookStruct)),MouseLLHookStruct)StaticmoubutAsMouseButtons:moubut=MouseButtons.None'鼠标按键StaticmouseDeltaAsInteger:mouseDelta=0'滚轮值SelectCasewParamCaseWM_LBUTTONDOWNmoubut=MouseButtons.LeftCaseWM_RBUTTONDOWNmoubut=MouseButtons.RightCaseWM_MBUTTONDOWNmoubut=MouseButtons.MiddleCaseWM_MOUSEWHEELStaticintAsInteger:int=(mouseHookStruct.MouseData>>16)And&HFFFF'本段代码CLE添加,模仿C#的Short从Int弃位转换Ifint>Short.MaxValueThenmouseDelta=int-65536ElsemouseDelta=intEndSelectStaticclickCountAsInteger:clickCount=0'单击次数Ifmoubut<>MouseButtons.NoneThenIfwParam=WM_LBUTTONDBLCLKOrElsewParam=WM_RBUTTONDBLCLKOrElsewParam=WM_MBUTTONDBLCLKThenclickCount=2ElseclickCount=1EndIfEndIfDimeAsNewMouseEventArgs(moubut,clickCount,mouseHookStruct.PT.X,mouseHookStruct.PT.Y,mouseDelta)RaiseEventMouseActivity(Me,e)EndIfReturnCallNextHookEx(hMouseHook,nCode,wParam,lParam)'激活下一个钩子EndFunction'''<summary>键盘钩子是否有效</summary>PublicPropertyKeyHookEnabled()AsBooleanGetReturnhKeyboardHook<>0EndGetSet(ByValvalueAsBoolean)IfvalueThenStartHook(True,False)ElseUnHook(True,False)EndSetEndProperty'''<summary>鼠标钩子是否有效</summary>PublicPropertyMouseHookEnabled()AsBooleanGetReturnhMouseHook<>0EndGetSet(ByValvalueAsBoolean)IfvalueThenStartHook(False,True)ElseUnHook(False,True)EndSetEndPropertyEndClass

解决方案

解决方案二:
如果你的代码是好用的。在程序运行的时候调用StartHook在程序退出的时候调用UnHook然后处理KeyPressMouseMove这些事件即可。
解决方案三:
引用1楼caozhy的回复:

如果你的代码是好用的。在程序运行的时候调用StartHook在程序退出的时候调用UnHook然后处理KeyPressMouseMove这些事件即可。

时间: 2024-08-01 13:49:33

vb.net 全局键盘钩子?的相关文章

C# 全局键盘钩子 与sendkey

问题描述 C#全局键盘钩子的问题,本人刚接触,很多问题不太清楚,最好指出怎么修改谢谢.程序功能:按ctrl组合键输出一个值,按F9时也输出一个值但是F9的时候Sendkeys.send(变量)可以正常输出,而ctrl组合键输出不正常(启动程序第一次按ctrl组合键输出正常,之后就不行了),这里的变量是数组的其中一个元素键盘钩子代码可以参考http://jingyan.baidu.com/article/ceb9fb10ebd9f68cad2ba03c.html或http://pan.baidu.

VB.NET全局键盘鼠标钩子[Vb.Net Hook](修正版)

原文有些BUG,因为这是段我从C#中转换而来的代码,所在最初的转换中因为两种语言的性质不同,所以无法完全兼容一些特性. 当然,现在的我已经完全有能力兼容两种语言的特性了,所以就重写了本段代码,将原代码中的事件检测,以及原代码中的KeyPress 时间无法检测输入字符大小写的BUG消除(在此感谢verywzm 同志) . 注意:本段代码如果想要在VS中运行,请将[工程属性] - [调试] - [启动 Visual Studio 宿主进程 ] 设置的勾去掉,或者使用 CTRL+F5 进行编译后调试!

C#全局键盘监听(Hook)的使用

一.为什么需要全局键盘监听? 在某些情况下应用程序需要实现快捷键执行特定功能,例如大家熟知的QQ截图功能Ctrl+Alt+A快捷键,只要QQ程序在运行(无论是拥有焦点还是处于后台运行状态),都可以按下快捷键使用此功能... 这个时候在程序中添加键盘监听肯定不能满足需求了,当用户焦点不在App上时(如最小化,或者用户在处理其它事物等等)键盘监听就失效了 二.怎样才能实现全局键盘监听? 这里需要用到Windows API,源码如下:(可以作为一个工具类[KeyboardHook.cs]收藏起来) u

vc++6 0-全局键盘钩子函数的回调函数有时无效

问题描述 全局键盘钩子函数的回调函数有时无效 DLL代码: myHooke.c #include "myHooke.h" #include <windows.h> #include <winuser.h> #include <stdlib.h> #include <stdio.h> int ndown = 0; HHOOK hhkHook = NULL; //定义钩子句柄 HINSTANCE hInstance = NULL; //程序实

开发环境:C++/MFC 现象:键盘钩子在基类 CHtmlView 时运行一短时间后失效。

问题描述 通过DLL方式,使用全局键盘钩子(WH_KEYBOARD_LL),运行程序后,键盘钩子有效,但大约15分钟后,键盘钩子就失效了.把界面从CHtmlView换成CView后,就一切正常.恳请哪位大侠提点一点,小弟先谢过. 解决方案 解决方案二:帮顶解决方案三:多谢热心的cloudgamertabby大大,问题已经解决,是自己的功力不够造成的失误,为帖子完整,把问题说一下.程序结构:MFC程序以DLL的方式调用全局键盘钩子症状:当界面用CVIEW类时,钩子正常运行.但当用CHtmlView

vb.net 如何调用全局鼠标钩子,求一个实例!!!

问题描述 vb.net如何调用全局鼠标钩子,求一个实例!!! 解决方案 解决方案二:以前收藏的全局键盘鼠标勾子.太多删了一点,鼠标的保留下来了ImportsSystem.Reflection,System.Threading,System.ComponentModel,System.Runtime.InteropServicesPublicClasshook#Region"定义结构"PrivateStructureMouseHookStructDimPTAsPointDimHwndAs

利用键盘钩子开发按键发音程序

本文配套源码 一.前言 一日,看见我妈正在用电脑练习打字,频频低头看键盘,我想:要是键盘能发音的话,不就可以方便她养成"盲打"的好习惯吗?光想不做可不行,开始行动(您可千万别急着去 拿工具箱啊^_^)... 按键能发音,其关键就是让程序能够知道当前键盘上是哪个键被按下,并播 放相应的声音,自己的程序当然不在话下,那么其它程序当前按下哪个键如何得知呢?利用键盘钩子便可 以很好地解决. 下载本文的全部源代码 大小:552K 二.挂钩(HOOK)的基本原理 WINDOWS调用挂接的回调函数时

hook-C# 全局键盘监听Hook监听不到

问题描述 C# 全局键盘监听Hook监听不到 使用的是网上的Hook轮子,如下 using System;using System.Collections.Generic;using System.Text;using System.Runtime.InteropServices;using System.Windows.Forms;using System.Reflection;namespace HookTest { /// <summary> /// 键盘钩子 /// [以下代码来自某网

在键盘钩子中对lParam进行Marshal.PtrToStructure类型转换时发生“内存保护”错误。

问题描述 键盘信息类:[StructLayout(LayoutKind.Sequential)]publicstructKeyBoardHookStruct{publicintvkCode;publicintscanCode;publicintflags;publicinttime;publicintdwExtraInfo;}在键盘钩子函数privateintKeyboardHookProc(intnCode,Int32wParam,IntPtrlParam)中进行KeyBoardHookStr