js获取桌面鼠标键盘事件怎么实现

2017-05-05

学习前端的同学你们知道怎么你们知道获取桌面鼠标键盘事件怎么实现吗?不知道的话跟着小编一起来学习了解获取桌面鼠标键盘事件吧。

获取桌面鼠标键盘事件的代码

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.Windows.Forms;

using System.Runtime.InteropServices;

using System.Reflection;

namespace UDPService

{

/// <summary>

///

/// </summary>

[StructLayout(LayoutKind.Sequential)]

public class POINT

{

public int x;

public int y;

}

/// <summary>

///

/// </summary>

[StructLayout(LayoutKind.Sequential)]

public class MouseHookStruct

{

public POINT pt;

public int hwnd;

public int wHitTestCode;

public int dwExtraInfo;

}

/// <summary>

///

/// </summary>

[StructLayout(LayoutKind.Sequential)]

public class KeyboardHookStruct

{

public int vkCode;

public int scanCode;

public int flags;

public int time;

public int dwExtraInfo;

}

/// <summary>

///

/// </summary>

public class GlobalHook

{

public delegate int HookProc(int nCode, Int32 wParam, IntPtr lParam);

public GlobalHook()

{

Start();

}

~GlobalHook()

{

Stop();

}

public event MouseEventHandler OnMouseActivity;

public event KeyEventHandler KeyDown;

public event KeyPressEventHandler KeyPress;

public event KeyEventHandler KeyUp;

public delegate int GlobalHookProc(int nCode, Int32 wParam, IntPtr lParam);

static int hMouseHook = 0;

static int hKeyboardHook = 0;

public const int WH_MOUSE_LL = 14;

public const int WH_KEYBOARD_LL = 13;

GlobalHookProc MouseHookProcedure;

GlobalHookProc KeyboardHookProcedure;

[DllImport("user32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]

public static extern int SetWindowsHookEx(int idHook, GlobalHookProc 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()

{

if (hMouseHook == 0)

{

MouseHookProcedure = new GlobalHookProc(MouseHookProc);

try

{

hMouseHook = SetWindowsHookEx(WH_MOUSE_LL,

MouseHookProcedure,

Marshal.GetHINSTANCE(

Assembly.GetExecutingAssembly().GetModules()[0]),

0);

}

catch (Exception err)

{ }

if (hMouseHook == 0)

{

Stop();

throw new Exception("SetWindowsHookEx failed.");

}

}

if (hKeyboardHook == 0)

{

KeyboardHookProcedure = new GlobalHookProc(KeyboardHookProc);

try

{

hKeyboardHook = SetWindowsHookEx(WH_KEYBOARD_LL,

KeyboardHookProcedure,

Marshal.GetHINSTANCE(

Assembly.GetExecutingAssembly().GetModules()[0]),

0);

}

catch (Exception err2)

{ }

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 (!(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 ((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)

{

if ((nCode >= 0) && (KeyDown != null || KeyUp != null || KeyPress != null))

{

KeyboardHookStruct MyKeyboardHookStruct =

(KeyboardHookStruct)Marshal.PtrToStructure(lParam,

typeof(KeyboardHookStruct));

if (KeyDown != null && (wParam == WM_KEYDOWN || wParam == WM_SYSKEYDOWN))

{

Keys keyData = (Keys)MyKeyboardHookStruct.vkCode;

KeyEventArgs e = new KeyEventArgs(keyData);

KeyDown(this, e);

}

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);

}

}

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);

}

}

}

猜你喜欢:

1.怎么用js获取鼠标移动坐标

2.怎么实现js跨浏览器获取鼠标按键的值

3.js怎么获取鼠标在div中的相对位置

4.win8.1 rtm有什么改进

5.怎么用js实现简单鼠标跟随效果

6.如何设置桌面鼠标图案

更多相关阅读

最新发布的文章