您的位置:首页 > 其它

全局鼠标键盘事件实现应用程序的自动锁定

2014-08-15 11:54 633 查看
我们在进行信息系统开发的时候,有时为了系统数据保密性、安全性得到提升。需要考虑到如果在用户长时间内没有对鼠标及键盘进行操作时,让应用程序自动锁定。并将当前用户所操作的界面隐藏。那么,为了实现该功能,我们需要对整个计算机内部的鼠标及键盘的操作进行记录。如果长时间内记录没有发生变化,则可以对系统进行锁定。

一、关键类的实现

在.NET现有的类库中,并没有实现对全局(可能是我没有发现)鼠标、键盘操作的相关事件及类的定义。为此,我们需要调用到API来辅助我们这个功能的实现。

那么,我们现在来定义一个API相关的类。并对鼠标、键盘的Hook进行定义及处理。现对这个类暂命名为:MouseKeyHook。

下面是MouseKeyHook的代码:


public class MouseKeyHook


{


[StructLayout(LayoutKind.Sequential)]


private class POINT


{


public int x;


public int y;


}




[StructLayout(LayoutKind.Sequential)]


private class MouseHookStruct


{


public POINT pt;


public int hwnd;


public int wHitTestCode;


public int dwExtraInfo;


}




[StructLayout(LayoutKind.Sequential)]


private class MouseLLHookStruct


{


public POINT pt;


public int mouseData;


public int flags;


public int time;


public int dwExtraInfo;


}




[StructLayout(LayoutKind.Sequential)]


private class KeyboardHookStruct


{


public int vkCode;


public int scanCode;


public int flags;


public int time;


public int dwExtraInfo;


}


[DllImport("user32.dll", CharSet = CharSet.Auto,


CallingConvention = CallingConvention.StdCall, SetLastError = true)]


private static extern int SetWindowsHookEx(


int idHook,


HookProc lpfn,


IntPtr hMod,


int dwThreadId);




[DllImport("user32.dll", CharSet = CharSet.Auto,


CallingConvention = CallingConvention.StdCall, SetLastError = true)]


private static extern int UnhookWindowsHookEx(int idHook);




[DllImport("user32.dll", CharSet = CharSet.Auto,


CallingConvention = CallingConvention.StdCall)]


private static extern int CallNextHookEx(


int idHook,


int nCode,


int wParam,


IntPtr lParam);




private delegate int HookProc(int nCode, int wParam, IntPtr lParam);




[DllImport("user32")]


private static extern int ToAscii(


int uVirtKey,


int uScanCode,


byte[] lpbKeyState,


byte[] lpwTransKey,


int fuState);




[DllImport("user32")]


private static extern int GetKeyboardState(byte[] pbKeyState);




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


private static extern short GetKeyState(int vKey);




private const int WH_MOUSE_LL = 14;


private const int WH_KEYBOARD_LL = 13;


private const int WH_MOUSE = 7;


private const int WH_KEYBOARD = 2;


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 const int WM_MOUSEWHEEL = 0x020A;




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 const byte VK_SHIFT = 0x10;


private const byte VK_CAPITAL = 0x14;


private const byte VK_NUMLOCK = 0x90;




public MouseKeyHook()


{


Start();


}




public MouseKeyHook(bool InstallMouseHook, bool InstallKeyboardHook)


{


Start(InstallMouseHook, InstallKeyboardHook);


}




~MouseKeyHook()


{


Stop(true, true, false);


}




public event MouseEventHandler OnMouseActivity;


public event KeyEventHandler KeyDown;


public event KeyPressEventHandler KeyPress;


public event KeyEventHandler KeyUp;






private int hMouseHook = 0;


private int hKeyboardHook = 0;






private static HookProc MouseHookProcedure;


private static HookProc KeyboardHookProcedure;






public void Start()


{


this.Start(true, true);


}




public void Start(bool InstallMouseHook, bool InstallKeyboardHook)


{


if (hMouseHook == 0 && InstallMouseHook)


{


MouseHookProcedure = new HookProc(MouseHookProc);


hMouseHook = SetWindowsHookEx(


WH_MOUSE_LL,


MouseHookProcedure,


Marshal.GetHINSTANCE(


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


0);


if (hMouseHook == 0)


{


int errorCode = Marshal.GetLastWin32Error();


Stop(true, false, false);


throw new Win32Exception(errorCode);


}


}




if (hKeyboardHook == 0 && InstallKeyboardHook)


{


KeyboardHookProcedure = new HookProc(KeyboardHookProc);


hKeyboardHook = SetWindowsHookEx(


WH_KEYBOARD_LL,


KeyboardHookProcedure,


Marshal.GetHINSTANCE(


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


0);


if (hKeyboardHook == 0)


{


int errorCode = Marshal.GetLastWin32Error();


Stop(false, true, false);


throw new Win32Exception(errorCode);


}


}


}




public void Stop()


{


this.Stop(true, true, true);


}




public void Stop(bool UninstallMouseHook, bool UninstallKeyboardHook, bool ThrowExceptions)


{


if (hMouseHook != 0 && UninstallMouseHook)


{


int retMouse = UnhookWindowsHookEx(hMouseHook);


hMouseHook = 0;


if (retMouse == 0 && ThrowExceptions)


{


int errorCode = Marshal.GetLastWin32Error();


throw new Win32Exception(errorCode);


}


}




if (hKeyboardHook != 0 && UninstallKeyboardHook)


{


int retKeyboard = UnhookWindowsHookEx(hKeyboardHook);


hKeyboardHook = 0;


if (retKeyboard == 0 && ThrowExceptions)


{


int errorCode = Marshal.GetLastWin32Error();


throw new Win32Exception(errorCode);


}


}


}






private int MouseHookProc(int nCode, int wParam, IntPtr lParam)


{


if ((nCode >= 0) && (OnMouseActivity != null))


{


MouseLLHookStruct mouseHookStruct = (MouseLLHookStruct)Marshal.PtrToStructure(lParam, typeof(MouseLLHookStruct));




MouseButtons button = MouseButtons.None;


short mouseDelta = 0;


switch (wParam)


{


case WM_LBUTTONDOWN:


button = MouseButtons.Left;


break;


case WM_RBUTTONDOWN:


button = MouseButtons.Right;


break;


case WM_MOUSEWHEEL:


mouseDelta = (short)((mouseHookStruct.mouseData >> 16) & 0xffff);


break;


}




int clickCount = 0;


if (button != MouseButtons.None)


if (wParam == WM_LBUTTONDBLCLK || wParam == WM_RBUTTONDBLCLK) clickCount = 2;


else clickCount = 1;




MouseEventArgs e = new MouseEventArgs(


button,


clickCount,


mouseHookStruct.pt.x,


mouseHookStruct.pt.y,


mouseDelta);


OnMouseActivity(this, e);


}


return CallNextHookEx(hMouseHook, nCode, wParam, lParam);


}




private int KeyboardHookProc(int nCode, Int32 wParam, IntPtr lParam)


{


bool handled = false;


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


handled = handled || e.Handled;


}




if (KeyPress != null && wParam == WM_KEYDOWN)


{


bool isDownShift = ((GetKeyState(VK_SHIFT) & 0x80) == 0x80 ? true : false);


bool isDownCapslock = (GetKeyState(VK_CAPITAL) != 0 ? true : false);




byte[] keyState = new byte[256];


GetKeyboardState(keyState);


byte[] inBuffer = new byte[2];


if (ToAscii(MyKeyboardHookStruct.vkCode,


MyKeyboardHookStruct.scanCode,


keyState,


inBuffer,


MyKeyboardHookStruct.flags) == 1)


{


char key = (char)inBuffer[0];


if ((isDownCapslock ^ isDownShift) && Char.IsLetter(key)) key = Char.ToUpper(key);


KeyPressEventArgs e = new KeyPressEventArgs(key);


KeyPress(this, e);


handled = handled || e.Handled;


}


}




if (KeyUp != null && (wParam == WM_KEYUP || wParam == WM_SYSKEYUP))


{


Keys keyData = (Keys)MyKeyboardHookStruct.vkCode;


KeyEventArgs e = new KeyEventArgs(keyData);


KeyUp(this, e);


handled = handled || e.Handled;


}




}




if (handled)


return 1;


else


return CallNextHookEx(hKeyboardHook, nCode, wParam, lParam);


}


}

通过上述类,我们可以来实现我们的应用程序的自动锁定功能了。

二、建测试项目

1、新建一个Windows应用程序。命名为:WindowsApplication1。

2、在该应用程序内添加一个类。类名为MouseKeyHook.cs,将上述代码添复制到该类中。

3、在Form1中添加一个Timer控件。

4、单击F7键打开Form1.cs。在里面添加局部变量:


private MouseKeyHook mouseKeyHook1=new MouseKeyHook(true,true);

5、在Form1的构造函数中添加如下代码:


public Form1()


{


InitializeComponent();


timer1.Interval=60000;//该处是定义一分钟的时间


mouseKeyHook1.KeyDown+=new KeyEventHandler(mouseKeyHook1_KeyDown);


mouseKeyHook1.KeyPress+=new KeyPressEventHandler(mouseKeyHook1_KeyPress);


mouseKeyHook1.KeyUp+=new KeyEventHandler(mouseKeyHook1_KeyUp);


mouseKeyHook1.OnMouseActivity+=new MouseEventHandler(mouseKeyHook1_OnMouseActivity);


mouseKeyHook1.Start(true,true);


}

6、打开Form1的设计窗口,在窗口内双击timer1,定义timer1的Tick事件。在Tick事件中加载如下代码:


private void timer_Tick(object sender, EventArgs e)


{


MessageBox.Show("该应用程序将被锁定。","提示", MessageBoxButtons.OK, MessageBoxIcon.Information);


Process.Start("logon.scr");//在这里启动一个屏幕保护程序。


}

7、定义mouseKeyHook1_KeyDown、mouseKeyHook1_KeyPress、mouseKeyHook1_KeyUp、mouseKeyHook1_OnMouseActivity事件。这几个事件调用的事件是一样的。即启动计时器。实现应用程序定时锁定的功能。下面举一例:


private mouseKeyHook1_KeyDown(object sender, KeyEventArgs e)


{


TimerClear();


}




//重新设置计时器


private void TimerClear()


{


timer1.Stop();


timer1.Start();


}

8、保存所有文件后,按“F5”键启动应用程序。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐