




























using System;
using System.Runtime.InteropServices;
using System.Reflection;
using System.Threading;
using System.Windows.Forms;
namespace GlobalHookDemo {
public class UserActivityHook : object {
public UserActivityHook() {
Start();
}
~UserActivityHook() {
Stop();
}
public event MouseEventHandler OnMouseActivity;
public event KeyEventHandler KeyDown;
public event KeyPressEventHandler KeyPress;
public event KeyEventHandler KeyUp;
static int hMouseHook = 0; //Declare mouse hook handle as int.
static int hKeyboardHook = 0; //Declare keyboard hook handle as int.
public delegate int HookProc(int nCode, Int32 wParam, IntPtr lParam);
//values from Winuser.h in Microsoft SDK.
public const int WH_MOUSE_LL = 14; //mouse hook constant
public const int WH_KEYBOARD_LL = 13; //keyboard hook constant
HookProc MouseHookProcedure;
HookProc KeyboardHookProcedure;
[StructLayout(LayoutKind.Sequential)]
public class POINT
{
public int x;
public int y;
}
[StructLayout(LayoutKind.Sequential)]
public class MouseHookStruct
{
public POINT pt;
public int hwnd;
public int wHitTestCode;
public int dwExtraInfo;
}
//Declare wrapper managed KeyboardHookStruct class.
[StructLayout(LayoutKind.Sequential)]
public class KeyboardHookStruct
{
public int vkCode; //Specifies a virtual-key code. The code must be a value in the range 1 to 254.
public int scanCode; // Specifies a hardware scan code for the key.
public int flags; // Specifies the extended-key flag, event-injected flag, context code, and transition-state flag.
public int time; // Specifies the time stamp for this message.
public int dwExtraInfo; // Specifies extra information associated with the message.
}
[DllImport("user32.dll",CharSet=CharSet.Auto,
CallingConvention=CallingConvention.StdCall)]
public static extern int SetWindowsHookEx(int idHook, HookProc lpfn, IntPtr hInstance, int threadId);
[DllImport("user32.dll",CharSet=CharSet.Auto,
CallingConvention=CallingConvention.StdCall)]
public static extern bool UnhookWindowsHookEx(int idHook);
[DllImport("user32.dll",CharSet=CharSet.Auto,
CallingConvention=CallingConvention.StdCall)]
public static extern int CallNextHookEx(int idHook, int nCode, Int32 wParam, IntPtr lParam);
public void Start()
{
// install Mouse hook
if(hMouseHook == 0)
{
MouseHookProcedure = new HookProc(MouseHookProc);
hMouseHook = SetWindowsHookEx( WH_MOUSE_LL,MouseHookProcedure, Marshal.GetHINSTANCE(Assembly.GetExecutingAssembly().GetModules()[0]),0);
if(hMouseHook == 0 ) {
Stop();
throw new Exception("SetWindowsHookEx failed."); }
}
// install Keyboard hook
if(hKeyboardHook == 0)
{KeyboardHookProcedure = new HookProc(KeyboardHookProc);
hKeyboardHook = SetWindowsHookEx( WH_KEYBOARD_LL,
KeyboardHookProcedure, Marshal.GetHINSTANCE(Assembly.GetExecutingAssembly().GetModules()[0]), 0);
if(hKeyboardHook == 0 ) {
Stop();
throw new Exception("SetWindowsHookEx ist failed.");
}
}
}
public void Stop()
{ bool retMouse =true;
bool retKeyboard = true;
if(hMouseHook != 0)
{
retMouse = UnhookWindowsHookEx(hMouseHook);
hMouseHook = 0;
}
if(hKeyboardHook != 0)
{retKeyboard = UnhookWindowsHookEx(hKeyboardHook);
hKeyboardHook = 0;
}
//If UnhookWindowsHookEx fails.
if (!(retMouse && retKeyboard)) throw new Exception("UnhookWindowsHookEx failed.");
}
private const int WM_MOUSEMOVE = 0x200;
private const int WM_LBUTTONDOWN = 0x201;
private const int WM_RBUTTONDOWN = 0x204;
private const int WM_MBUTTONDOWN = 0x207;
private const int WM_LBUTTONUP = 0x202;
private const int WM_RBUTTONUP = 0x205;
private const int WM_MBUTTONUP = 0x208;
private const int WM_LBUTTONDBLCLK = 0x203;
private const int WM_RBUTTONDBLCLK = 0x206;
private const int WM_MBUTTONDBLCLK = 0x209;
private int MouseHookProc(int nCode, Int32 wParam, IntPtr lParam)
{
// if ok and someone listens to our events
if ((nCode >= 0) && (OnMouseActivity!=null)) {
MouseButtons button=MouseButtons.None;
switch (wParam)
{
case WM_LBUTTONDOWN:
//case WM_LBUTTONUP:
//case WM_LBUTTONDBLCLK:
button=MouseButtons.Left;
break;
case WM_RBUTTONDOWN:
//case WM_RBUTTONUP:
//case WM_RBUTTONDBLCLK:
button=MouseButtons.Right;
break;
}
int clickCount=0;
if (button!=MouseButtons.None)
if (wParam==WM_LBUTTONDBLCLK || wParam==WM_RBUTTONDBLCLK) clickCount=2;
else clickCount=1;
MouseHookStruct MyMouseHookStruct = (MouseHookStruct) Marshal.PtrToStructure(lParam, typeof(MouseHookStruct));
MouseEventArgs e=new MouseEventArgs( button, clickCount, MyMouseHookStruct.pt.x, MyMouseHookStruct.pt.y, 0 );
OnMouseActivity(this, e); }
return CallNextHookEx(hMouseHook, nCode, wParam, lParam); }
[DllImport("user32")]
public static extern int ToAscii(int uVirtKey, int uScanCode, byte[] lpbKeyState,byte[] lpwTransKey,int fuState);
[DllImport("user32")]
public static extern int GetKeyboardState(byte[] pbKeyState);
private const int WM_KEYDOWN = 0x100;
private const int WM_KEYUP = 0x101;
private const int WM_SYSKEYDOWN = 0x104;
private const int WM_SYSKEYUP = 0x105;
private int KeyboardHookProc(int nCode, Int32 wParam, IntPtr lParam)
{
// it was ok and someone listens to events
if ((nCode >= 0) && (KeyDown!=null || KeyUp!=null || KeyPress!=null))
{
KeyboardHookStruct MyKeyboardHookStruct = (KeyboardHookStruct) Marshal.PtrToStructure(lParam, typeof(KeyboardHookStruct));
// raise KeyDown
if ( KeyDown!=null && ( wParam ==WM_KEYDOWN || wParam==WM_SYSKEYDOWN ))
{
Keys keyData=(Keys)MyKeyboardHookStruct.vkCode;
KeyEventArgs e = new KeyEventArgs(keyData);
KeyDown(this, e);
}
// raise KeyPress
if ( KeyPress!=null && wParam ==WM_KEYDOWN )
{
byte[] keyState = new byte[256];
GetKeyboardState(keyState);
byte[] inBuffer= new byte[2];
if (ToAscii(MyKeyboardHookStruct.vkCode,
MyKeyboardHookStruct.scanCode,
keyState,
inBuffer,
MyKeyboardHookStruct.flags)==1)
{
KeyPressEventArgs e = new KeyPressEventArgs((char)inBuffer[0]);
KeyPress(this, e);
}
}
// raise KeyUp
if ( KeyUp!=null && ( wParam ==WM_KEYUP || wParam==WM_SYSKEYUP ))
{
Keys keyData=(Keys)MyKeyboardHookStruct.vkCode;
KeyEventArgs e = new KeyEventArgs(keyData);
KeyUp(this, e);
}
}
return CallNextHookEx(hKeyboardHook, nCode, wParam, lParam);
}}}
Imports System.Runtime.InteropServices
Imports System.Reflection
Public Class UserActivityHook
Public Sub New()
StartHook()
End Sub
Protected Overrides Sub Finalize()
StopHook()
End Sub
Public Event OnMouseActivity As MouseEventHandler
Public Event KeyDown As KeyEventHandler
Public Event KeyPress As KeyPressEventHandler
Public Event KeyUp As KeyEventHandler
Dim hMouseHook As Integer = 0 '//Declare mouse hook handle as int.
Dim hKeyboardHook As Integer = 0 '//Declare keyboard hook handle as int.
#Region "Define parameters"
Public Delegate Function HookProc(ByVal nCode As Integer, ByVal wParam As Int32, ByVal lParam As IntPtr) As Integer
Public Const WH_MOUSE_LL As Integer = 14 '//mouse hook constant
Public Const WH_KEYBOARD_LL As Integer = 13 '//keyboard hook constant
Public MouseHookProcedure As HookProc
Public KeyboardHookProcedure As HookProc
Public Structure Point
Public x As Integer
Public y As Integer
End Structure
Public Structure MouseHookStruct
Public pt As Point
Public hwnd As Integer
Public wHitTestCode As Integer
Public dwExtraInfo As Integer
End Structure
Public Structure KeyboardHookStruct
Public vkCode As Integer '//Specifies a virtual-key code. The code must be a value in the range 1 to 254.
Public scanCode As Integer '// Specifies a hardware scan code for the key.
Public flags As Integer '// Specifies the extended-key flag, event-injected flag, context code, and transition-state flag.
Public time As Integer '// Specifies the time stamp for this message.
Public dwExtraInfo As Integer '// Specifies extra information associated with the message.
End Structure
Public Declare Function SetWindowsHookEx Lib "user32" Alias "SetWindowsHookExA" (ByVal idHook As Integer, ByVal lpfn As HookProc, ByVal hmod As Integer, ByVal dwThreadId As Integer) As Integer
Public Declare Function CallNextHookEx Lib "user32" Alias "CallNextHookEx" (ByVal idHook As Integer, ByVal ncode As Integer, ByVal wParam As Int32, ByVal lParam As IntPtr) As Integer
Public Declare Function UnhookWindowsHookEx Lib "user32" Alias "UnhookWindowsHookEx" (ByVal idHook As Integer) As Boolean
#End Region
Public Sub StartHook()
'// install Mouse hook
If (hMouseHook = 0) Then
'// Create an instance of HookProc.
MouseHookProcedure = New HookProc(AddressOf MouseHookProc)
hMouseHook = SetWindowsHookEx(WH_MOUSE_LL, MouseHookProcedure, Marshal.GetHINSTANCE(Assembly.GetExecutingAssembly().GetModules()(0)).ToInt32, 0)
'//If SetWindowsHookEx fails.
If (hMouseHook = 0) Then
StopHook()
End If
End If
'// install Keyboard hook
If (hKeyboardHook = 0) Then
KeyboardHookProcedure = New HookProc(AddressOf KeyboardHookProc)
hKeyboardHook = SetWindowsHookEx(WH_KEYBOARD_LL, KeyboardHookProcedure, Marshal.GetHINSTANCE(Assembly.GetExecutingAssembly().GetModules()(0)).ToInt32, 0)
'//If SetWindowsHookEx fails.
If (hKeyboardHook = 0) Then
StopHook()
End If
End If
End Sub
Public Sub StopHook()
Dim retMouse As Boolean = True
Dim retKeyboard As Boolean = True
If hMouseHook <> 0 Then
retMouse = UnhookWindowsHookEx(hMouseHook)
hMouseHook = 0
End If
If hKeyboardHook <> 0 Then
retKeyboard = UnhookWindowsHookEx(hKeyboardHook)
hKeyboardHook = 0
End If
'//If UnhookWindowsHookEx fails.
If Not (retMouse And retKeyboard) Then
Throw New Exception("UnhookWindowsHookEx failed.")
End If
End Sub
Private Const WM_MOUSEMOVE As Integer = &H200 'Convert.ToInt32("0x200", 16)
Private Const WM_LBUTTONDOWN As Integer = &H201
Private Const WM_RBUTTONDOWN As Integer = &H204
Private Const WM_MBUTTONDOWN As Integer = &H207
Private Const WM_LBUTTONUP As Integer = &H202
Private Const WM_RBUTTONUP As Integer = &H205
Private Const WM_MBUTTONUP As Integer = &H208
Private Const WM_LBUTTONDBLCLK As Integer = &H203
Private Const WM_RBUTTONDBLCLK As Integer = &H206
Private Const WM_MBUTTONDBLCLK As Integer = &H209
Private Function MouseHookProc(ByVal nCode As Integer, ByVal wParam As Int32, ByVal lParam As IntPtr) As Integer
If (nCode >= 0) And (OnMouseActivityEvent IsNot Nothing) Then
Dim button As New MouseButtons
button = MouseButtons.None
Select Case wParam
Case WM_LBUTTONDOWN
'//case WM_LBUTTONUP:
'//case WM_LBUTTONDBLCLK:
button = MouseButtons.Left
Case WM_RBUTTONDOWN
'//case WM_RBUTTONUP:
'//case WM_RBUTTONDBLCLK:
button = MouseButtons.Right
End Select
Dim clickCount As Integer = 0
If (button <> MouseButtons.None) Then
If (wParam = WM_LBUTTONDBLCLK Or wParam = WM_RBUTTONDBLCLK) Then
clickCount = 2
Else
clickCount = 1
End If
End If
'//Marshall the data from callback.
Dim MyMouseHookStruct As MouseHookStruct
MyMouseHookStruct = Marshal.PtrToStructure(lParam, GetType(MouseHookStruct))
Dim e As MouseEventArgs
e = New MouseEventArgs(button, clickCount, MyMouseHookStruct.pt.x, MyMouseHookStruct.pt.y, 0)
RaiseEvent OnMouseActivity(Me, e)
Return CallNextHookEx(hMouseHook, nCode, wParam, lParam)
End If
End Function
#Region "Define keyboard parameters"
Private Const WM_KEYDOWN As Integer = &H100 '0x100
Private Const WM_KEYUP As Integer = &H101
Private Const WM_SYSKEYDOWN As Integer = &H104
Private Const WM_SYSKEYUP As Integer = &H105
#End Region
Private Function KeyboardHookProc(ByVal nCode As Integer, ByVal wParam As Int32, ByVal lParam As IntPtr) As Integer
If ((nCode >= 0) And (KeyDownEvent IsNot Nothing Or KeyUpEvent IsNot Nothing Or KeyPressEvent IsNot Nothing)) Then
Dim MyKeyboardHookStruct As KeyboardHookStruct
MyKeyboardHookStruct = Marshal.PtrToStructure(lParam, GetType(KeyboardHookStruct))
'// raise KeyDown
If (KeyDownEvent IsNot Nothing And (wParam = WM_KEYDOWN Or wParam = WM_SYSKEYDOWN)) Then
Dim keyData As Keys
keyData = MyKeyboardHookStruct.vkCode
Dim e As KeyEventArgs
e = New KeyEventArgs(keyData)
RaiseEvent KeyDown(Me, e)
End If
'// raise KeyPress
If (KeyPressEvent IsNot Nothing And wParam = WM_KEYDOWN) Then
Dim keyState As Byte
ZClsAPIs.GetKeyboardState(keyState)
Dim inBuffer As Byte
If (ZClsAPIs.ToAscii(MyKeyboardHookStruct.vkCode, MyKeyboardHookStruct.scanCode, keyState, inBuffer, MyKeyboardHookStruct.flags) = 1) Then
Dim e As KeyPressEventArgs
e = New KeyPressEventArgs(CChar(CStr(inBuffer)))
RaiseEvent KeyPress(Me, e)
End If
End If
'// raise KeyUp
If (KeyUpEvent IsNot Nothing And (wParam = WM_KEYUP Or wParam = WM_SYSKEYUP)) Then
Dim keyData As Keys
keyData = MyKeyboardHookStruct.vkCode
Dim e As KeyEventArgs
e = New KeyEventArgs(keyData)
RaiseEvent KeyUp(Me, e)
End If
End If
Return CallNextHookEx(hKeyboardHook, nCode, wParam, lParam)
End Function
End Class
void ButtonStartClick(object sender, System.EventArgs e)
{
actHook.Start();
}
void ButtonStopClick(object sender, System.EventArgs e)
{
actHook.Stop();
}
UserActivityHook actHook;
void MainFormLoad(object sender, System.EventArgs e)
{
actHook= new UserActivityHook(); // crate an instance
// hang on events
actHook.OnMouseActivity+=new MouseEventHandler(MouseMoved);
actHook.KeyDown+=new KeyEventHandler(MyKeyDown);
actHook.KeyPress+=new KeyPressEventHandler(MyKeyPress);
actHook.KeyUp+=new KeyEventHandler(MyKeyUp);
}
public void MouseMoved(object sender, MouseEventArgs e)
{
labelMousePosition.Text=String.Format("x={0} y={1}", e.X, e.Y);
if (e.Clicks>0) LogWrite("MouseButton - " + e.Button.ToString());
}
public void MyKeyDown(object sender, KeyEventArgs e)
{
LogWrite("KeyDown - " + e.KeyData.ToString());
}
public void MyKeyPress(object sender, KeyPressEventArgs e)
{
LogWrite("KeyPress - " + e.KeyChar);
}
public void MyKeyUp(object sender, KeyEventArgs e)
{
LogWrite("KeyUp - " + e.KeyData.ToString());
}
private void LogWrite(string txt)
{
textBox.AppendText(txt + Environment.NewLine);
textBox.SelectionStart = textBox.Text.Length;
}
}
Imports System.Runtime.InteropServices
Public Class A00FmLogin
Dim actHook As UserActivityHook
Private Sub BTNsubmit_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BTNsubmit.Click
Me.Hide()
My.Forms.A00Main.Show()
End Sub
Private Sub BTNquit_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BTNquit.Click
Application.Exit()
End Sub
Private Sub BTNreset_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BTNreset.Click
'Call SetWallpaper(Me.BackgroundImage)
actHook.StopHook()
End Sub
Private Sub A00FmLogin_FormClosing(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing
actHook.StopHook()
End Sub
Private Sub A00FmLogin_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
actHook = New UserActivityHook() '// crate an instance
'// hang on events
AddHandler actHook.OnMouseActivity, New MouseEventHandler(AddressOf MouseMoved)
AddHandler actHook.KeyDown, New KeyEventHandler(AddressOf MyKeyDown)
AddHandler actHook.KeyPress, New KeyPressEventHandler(AddressOf MyKeyPress)
AddHandler actHook.KeyUp, New KeyEventHandler(AddressOf MyKeyUp)
End Sub
Private Sub BTNoptions_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BTNoptions.Click
actHook.StartHook()
End Sub
Public Sub MouseMoved(ByVal sender As Object, ByVal e As MouseEventArgs)
LABwebsite.Text = "x=" & e.X & " y=" & e.Y
If (e.Clicks > 0) Then LogWrite("MouseButton - " + e.Button.ToString())
End Sub
Public Sub MyKeyDown(ByVal sender As Object, ByVal e As KeyEventArgs)
LogWrite("KeyDown - " + e.KeyData.ToString())
End Sub
Public Sub MyKeyPress(ByVal sender As Object, ByVal e As KeyPressEventArgs)
LogWrite("KeyPress - " + e.KeyChar)
End Sub
Public Sub MyKeyUp(ByVal sender As Object, ByVal e As KeyEventArgs)
LogWrite("KeyUp - " + e.KeyData.ToString())
End Sub
Private Sub LogWrite(ByVal txt As String)
TBOst.AppendText(txt + Environment.NewLine)
TBOst.SelectionStart = TBOst.Text.Length
End Sub
End Class
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。