免费视频淫片aa毛片_日韩高清在线亚洲专区vr_日韩大片免费观看视频播放_亚洲欧美国产精品完整版

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費(fèi)電子書等14項(xiàng)超值服

開(kāi)通VIP
C#實(shí)現(xiàn)鼠標(biāo)鍵盤的監(jiān)控和屏蔽 - 技術(shù)應(yīng)用 - 豆豆網(wǎng)

C#實(shí)現(xiàn)鼠標(biāo)鍵盤的監(jiān)控和屏蔽

http://tech.ddvip.com   2008年11月04日    社區(qū)交流

C#實(shí)現(xiàn)鼠標(biāo)鍵盤的監(jiān)控和屏蔽。

  下載源程序和運(yùn)行程序

  http://file.ddvip.com/2008_11/1225788644_ddvip_7698.rar

  運(yùn)行界面如下:

  二說(shuō)明:

  在C++中實(shí)現(xiàn)該功能十分簡(jiǎn)單,也有很多經(jīng)典例子可以實(shí)現(xiàn),在C#中確有很多問(wèn)題會(huì)出現(xiàn)。

  對(duì)于鉤子知識(shí)不太熟悉可以參考我轉(zhuǎn)載的另一篇文章:http://www.cnblogs.com/hocylan/articles/1033895.html[微軟HOOK技術(shù)專題]

  三大概步驟

  其實(shí)主要就是調(diào)用windows API

  第一步:安裝鉤子:SetWindowsHookEx(WH_Codes idHook, HookProc lpfn,IntPtr pInstance, int threadId);

  第二步:回調(diào)和處理CallNextHookEx(IntPtr pHookHandle, int nCode,Int32 wParam, IntPtr lParam);

  第三步:完成普通的業(yè)務(wù)處理其它流程

  將封裝的鉤子應(yīng)用到系統(tǒng)中…….

    private void start_Click(object sender, EventArgs e)
    {hook_Main.InstallHook("1");}
    private void stop_Click(object sender, EventArgs e)
    {this.hook_Main.UnInstallHook();}
    private void stopkeyboard_Click(object sender, EventArgs e)
    { hook_Main.InstallHook("2"); }

  第四步:拆卸鉤子UnhookWindowsHookEx(IntPtr pHookHandle);

  四 重要代碼和解釋:

  *封裝的hook類:

using System;
using System.Windows.Forms;
using System.Runtime.InteropServices;//必須引用
using System.Reflection; //必須引用
namespace KeyboardHook
{
  class Hocy_Hook
  {
    #region私有常量
     ///<summary>
     ///按鍵狀態(tài)數(shù)組
     ///</summary>
     private readonly byte[] m_KeyState = new byte[ 256 ];
    private string flags;
    //flag=0 正常 flag=1 監(jiān)控狀態(tài) flag=2 屏蔽鍵盤//
     #endregion私有常量
     #region私有變量
     ///<summary>
     ///鼠標(biāo)鉤子句柄
     ///</summary>
     private IntPtr m_pMouseHook = IntPtr.Zero;
     ///<summary>
     ///鍵盤鉤子句柄
     ///</summary>
     private IntPtr m_pKeyboardHook = IntPtr.Zero;
     ///<summary>
     ///鼠標(biāo)鉤子委托實(shí)例
     ///</summary>
     ///<remarks>
     ///不要試圖省略此變量,否則將會(huì)導(dǎo)致
     ///激活CallbackOnCollectedDelegate 托管調(diào)試助手(MDA)。
     ///詳細(xì)請(qǐng)參見(jiàn)MSDN中關(guān)于CallbackOnCollectedDelegate 的描述
     ///</remarks>
     private HookProc m_MouseHookProcedure;
     ///<summary>
     ///鍵盤鉤子委托實(shí)例
     ///</summary>
     ///<remarks>
     ///不要試圖省略此變量,否則將會(huì)導(dǎo)致
     ///激活CallbackOnCollectedDelegate 托管調(diào)試助手(MDA)。
     ///詳細(xì)請(qǐng)參見(jiàn)MSDN中關(guān)于CallbackOnCollectedDelegate 的描述
     ///</remarks>
     private HookProc m_KeyboardHookProcedure;
    // 添加
    public event MouseEventHandler OnMouseActivity;
    private const byte VK_SHIFT = 0x10 ;
    private const byte VK_CAPITAL = 0x14;
    private const byte VK_NUMLOCK = 0x90;
     #endregion私有變量
     #region事件定義
     ///<summary>
     ///鼠標(biāo)更新事件
     ///</summary>
     ///<remarks>當(dāng)鼠標(biāo)移動(dòng)或者滾輪滾動(dòng)時(shí)觸發(fā)</remarks>
     public event MouseUpdateEventHandler OnMouseUpdate;
     ///<summary>
     ///按鍵按下事件
     ///</summary>
     public event KeyEventHandler OnKeyDown;
     ///<summary>
     ///按鍵按下并釋放事件
     ///</summary>
     public event KeyPressEventHandler OnKeyPress;
     ///<summary>
     ///按鍵釋放事件
     ///</summary>
     public event KeyEventHandler OnKeyUp;
     #endregion事件定義
     #region私有方法
     ///<summary>
     ///鼠標(biāo)鉤子處理函數(shù)
     ///</summary>
     ///<param name="nCode"></param>
     ///<param name="wParam"></param>
     ///<param name="lParam"></param>
     ///<returns>鼠標(biāo)鉤子處理函數(shù)</returns>
     private int MouseHookProc( int nCode, Int32 wParam, IntPtr lParam )
     {
if ((nCode >= 0) && (OnMouseActivity != null))
      {
        //Marshall the data from callback.
        MouseHookStruct mouseHookStruct = (MouseHookStruct)Marshal.PtrToStructure(lParam, typeof(MouseHookStruct));
        //detect button clicked
        MouseButtons button = MouseButtons.None;
        short mouseDelta = 0;
        switch (wParam)
        {
          case (int)WM_MOUSE.WM_LBUTTONDOWN:
            //case WM_LBUTTONUP:
            //case WM_LBUTTONDBLCLK:
            button = MouseButtons.Left;
            break;
          case (int)WM_MOUSE.WM_RBUTTONDOWN:
            //case WM_RBUTTONUP:
            //case WM_RBUTTONDBLCLK:
            button = MouseButtons.Right;
            break;
          case (int)WM_MOUSE.WM_MOUSEWHEEL:
            //If the message is WM_MOUSEWHEEL, the high-order word of mouseData member is the wheel delta.
            //One wheel click is defined as WHEEL_DELTA, which is 120.
            //(value >> 16) & 0xffff; retrieves the high-order word from the given 32-bit value
            mouseDelta = (short)((mouseHookStruct.MouseData>> 16) & 0xffff);
            //TODO: X BUTTONS (I havent them so was unable to test)
            //If the message is WM_XBUTTONDOWN, WM_XBUTTONUP, WM_XBUTTONDBLCLK, WM_NCXBUTTONDOWN, WM_NCXBUTTONUP,
            //or WM_NCXBUTTONDBLCLK, the high-order word specifies which X button was pressed or released,
            //and the low-order word is reserved. This value can be one or more of the following values.
            //Otherwise, mouseData is not used.
            break;
        }
        //double clicks
        int clickCount = 0;
        if (button != MouseButtons.None)
          if (wParam == (int)WM_MOUSE.WM_LBUTTONDBLCLK || wParam == (int)WM_MOUSE.WM_RBUTTONDBLCLK) clickCount = 2;
          else clickCount = 1;
        //generate event
        MouseEventArgs e = new MouseEventArgs(
                          button,
                         clickCount,
                          mouseHookStruct.Point.X,
                          mouseHookStruct.Point.Y,
                          mouseDelta);
        //raise it
        OnMouseActivity(this, e);
      }
      //*
       return Win32API.CallNextHookEx( this.m_pMouseHook, nCode, wParam, lParam );
     }
     ///<summary>
     ///鍵盤鉤子處理函數(shù)
     ///</summary>
     ///<param name="nCode"></param>
     ///<param name="wParam"></param>
     ///<param name="lParam"></param>
     ///<returns></returns>
     ///<remarks></remarks>
     private int KeyboardHookProc( int nCode, Int32 wParam, IntPtr lParam )
     {
      switch (flags)
      {
        case "2":
          return 1;
          break;
        case "1":
          break;
      }
      bool handled = false;
      //it was ok and someone listens to events
      if ((nCode >= 0) && (this.OnKeyDown != null || this.OnKeyUp!= null || this.OnKeyPress!= null))
      {
        //read structure KeyboardHookStruct at lParam
        KeyboardHookStruct MyKeyboardHookStruct = (KeyboardHookStruct)Marshal.PtrToStructure(lParam, typeof(KeyboardHookStruct));
        //raise KeyDown
        if (this.OnKeyDown != null && (wParam == (int)WM_KEYBOARD.WM_KEYDOWN || wParam == (int)WM_KEYBOARD.WM_SYSKEYDOWN))
        {
          Keys keyData = (Keys)MyKeyboardHookStruct.VKCode;
          KeyEventArgs e = new KeyEventArgs(keyData);
          this.OnKeyDown(this, e);
          handled = handled || e.Handled;
        }
        // raise KeyPress
          if (this.OnKeyPress != null && wParam == (int)WM_KEYBOARD.WM_KEYDOWN)
          {
            bool isDownShift, isDownCapslock;
            try
            {
               isDownShift = ((Win32API.GetKeyStates(VK_SHIFT) & 0x80) == 0x80 ? true : false);
              isDownCapslock = (Win32API.GetKeyStates(VK_CAPITAL) != 0 ? true : false);
            }
            catch
            {
              isDownCapslock = false;
              isDownShift= false;
            }
            byte[] keyState = new byte[256];
            Win32API.GetKeyboardState(keyState);
            byte[] inBuffer = new byte[2];
            if (Win32API.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);
              this.OnKeyPress(this, e);
              handled = handled || e.Handled;
            }
          }
        // raise KeyUp
        if (this.OnKeyUp != null && (wParam == (int)WM_KEYBOARD.WM_KEYUP || wParam == (int)WM_KEYBOARD.WM_SYSKEYUP))
        {
          Keys keyData = (Keys)MyKeyboardHookStruct.VKCode;
          KeyEventArgs e = new KeyEventArgs(keyData);
          this.OnKeyUp(this, e);
          handled = handled || e.Handled;
        }
      }
      //if event handled in application do not handoff to other listeners
      if (handled)
        return 1;
      else
        return Win32API.CallNextHookEx(this.m_pKeyboardHook, nCode, wParam, lParam);
    }
     #endregion私有方法
     #region公共方法
     ///<summary>
     ///安裝鉤子
     ///</summary>
     ///<returns></returns>
     public bool InstallHook(string flagsinfo)
     {
      this.flags = flagsinfo;
IntPtr pInstance = Marshal.GetHINSTANCE(Assembly.GetExecutingAssembly().ManifestModule);
//pInstance = (IntPtr)4194304;
     //注意:很多時(shí)候得到的pInstanc無(wú)法安裝鉤子,請(qǐng)檢查值是否為4194304,在應(yīng)用程序中可以直接取得pinstance的
      // IntPtr pInstanc2 = Marshal.GetHINSTANCE(Assembly.GetExecutingAssembly());
      // Assembly.GetExecutingAssembly().GetModules()[0]
       //安裝鼠標(biāo)鉤子
       if ( this.m_pMouseHook == IntPtr.Zero )
       {
          this.m_MouseHookProcedure = new HookProc( this.MouseHookProc );
          this.m_pMouseHook = Win32API.SetWindowsHookEx( WH_Codes.WH_MOUSE_LL,this.m_MouseHookProcedure, pInstance, 0 );
// WH_Codes.WH_MOUSE_LL為全局鉤子即系統(tǒng)鉤子,否則應(yīng)該為WH_Codes.WH_KEYBOARD,即普通鉤子
          if ( this.m_pMouseHook == IntPtr.Zero )
          {
            this.UnInstallHook();
            return false;
          }
       }
       if ( this.m_pKeyboardHook == IntPtr.Zero ) //安裝鍵盤鉤子
       {
          this.m_KeyboardHookProcedure = new HookProc( this.KeyboardHookProc );
         // WH_Codes.WH_KEYBOARD_LL為全局鉤子即系統(tǒng)鉤子,否則應(yīng)該為WH_Codes.WH_KEYBOARD,即普通鉤子
          this.m_pKeyboardHook = Win32API.SetWindowsHookEx( WH_Codes.WH_KEYBOARD_LL,this.m_KeyboardHookProcedure, pInstance, 0 );
          if ( this.m_pKeyboardHook == IntPtr.Zero )
          {
            this.UnInstallHook();
            return false;
          }
       }
       return true;
     }
     ///<summary>
     ///卸載鉤子
     ///</summary>
     ///<returns></returns>
     public bool UnInstallHook()
     {
       bool result = true;
       if ( this.m_pMouseHook != IntPtr.Zero )
       {
          result = ( Win32API.UnhookWindowsHookEx( this.m_pMouseHook ) && result );
          this.m_pMouseHook = IntPtr.Zero;
       }
       if ( this.m_pKeyboardHook != IntPtr.Zero )
       {
          result = ( Win32API.UnhookWindowsHookEx( this.m_pKeyboardHook ) && result );
          this.m_pKeyboardHook = IntPtr.Zero;
       }
       return result;
     }
     #endregion公共方法
     #region構(gòu)造函數(shù)
     ///<summary>
     ///鉤子類
     ///</summary>
     ///<remarks>本類僅僅簡(jiǎn)單實(shí)現(xiàn)了WH_KEYBOARD_LL 以及WH_MOUSE_LL </remarks>
     public Hocy_Hook()
     {
       Win32API.GetKeyboardState( this.m_KeyState );
     }
     #endregion構(gòu)造函數(shù)
  }
}

本站僅提供存儲(chǔ)服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊舉報(bào)。
打開(kāi)APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
C# 鍵盤記錄器
Winform 鍵盤鉤子,鎖屏小工具的實(shí)現(xiàn)(一)
C# 鍵盤鉤子和鼠標(biāo)鉤子的使用詳解
抓取掃描槍掃描數(shù)據(jù)的案例
C# 區(qū)分鍵盤和紅外線掃描槍輸入 模擬掃描槍
C# 鍵盤監(jiān)視+剪切板編程
更多類似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長(zhǎng)圖 關(guān)注 下載文章
綁定賬號(hào)成功
后續(xù)可登錄賬號(hào)暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服