亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C# > 正文

C#實現可捕獲幾乎所有鍵盤鼠標事件的鉤子類完整實例

2020-01-24 01:07:09
字體:
來源:轉載
供稿:網友

本文實例講述了C#實現可捕獲幾乎所有鍵盤鼠標事件的鉤子類。分享給大家供大家參考,具體如下:

using System;using System.Text;using System.Runtime.InteropServices;using System.Reflection;using System.Windows.Forms;namespace MouseKeyboardLibrary{  /// <summary>  /// Abstract base class for Mouse and Keyboard hooks  /// </summary>  public abstract class GlobalHook  {    #region Windows API Code    [StructLayout(LayoutKind.Sequential)]    protected class POINT    {      public int x;      public int y;    }    [StructLayout(LayoutKind.Sequential)]    protected class MouseHookStruct    {      public POINT pt;      public int hwnd;      public int wHitTestCode;      public int dwExtraInfo;    }    [StructLayout(LayoutKind.Sequential)]    protected class MouseLLHookStruct    {      public POINT pt;      public int mouseData;      public int flags;      public int time;      public int dwExtraInfo;    }    [StructLayout(LayoutKind.Sequential)]    protected 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)]    protected static extern int SetWindowsHookEx(      int idHook,      HookProc lpfn,      IntPtr hMod,      int dwThreadId);    [DllImport("user32.dll", CharSet = CharSet.Auto,      CallingConvention = CallingConvention.StdCall, SetLastError = true)]    protected static extern int UnhookWindowsHookEx(int idHook);    [DllImport("user32.dll", CharSet = CharSet.Auto,       CallingConvention = CallingConvention.StdCall)]    protected static extern int CallNextHookEx(      int idHook,      int nCode,      int wParam,      IntPtr lParam);    [DllImport("user32")]    protected static extern int ToAscii(      int uVirtKey,      int uScanCode,      byte[] lpbKeyState,      byte[] lpwTransKey,      int fuState);    [DllImport("user32")]    protected static extern int GetKeyboardState(byte[] pbKeyState);    [DllImport("user32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]    protected static extern short GetKeyState(int vKey);    protected delegate int HookProc(int nCode, int wParam, IntPtr lParam);    protected const int WH_MOUSE_LL = 14;    protected const int WH_KEYBOARD_LL = 13;    protected const int WH_MOUSE = 7;    protected const int WH_KEYBOARD = 2;    protected const int WM_MOUSEMOVE = 0x200;    protected const int WM_LBUTTONDOWN = 0x201;    protected const int WM_RBUTTONDOWN = 0x204;    protected const int WM_MBUTTONDOWN = 0x207;    protected const int WM_LBUTTONUP = 0x202;    protected const int WM_RBUTTONUP = 0x205;    protected const int WM_MBUTTONUP = 0x208;    protected const int WM_LBUTTONDBLCLK = 0x203;    protected const int WM_RBUTTONDBLCLK = 0x206;    protected const int WM_MBUTTONDBLCLK = 0x209;    protected const int WM_MOUSEWHEEL = 0x020A;    protected const int WM_KEYDOWN = 0x100;    protected const int WM_KEYUP = 0x101;    protected const int WM_SYSKEYDOWN = 0x104;    protected const int WM_SYSKEYUP = 0x105;    protected const byte VK_SHIFT = 0x10;    protected const byte VK_CAPITAL = 0x14;    protected const byte VK_NUMLOCK = 0x90;    protected const byte VK_LSHIFT = 0xA0;    protected const byte VK_RSHIFT = 0xA1;    protected const byte VK_LCONTROL = 0xA2;    protected const byte VK_RCONTROL = 0x3;    protected const byte VK_LALT = 0xA4;    protected const byte VK_RALT = 0xA5;    protected const byte LLKHF_ALTDOWN = 0x20;    #endregion    #region Private Variables    protected int _hookType;    protected int _handleToHook;    protected bool _isStarted;    protected HookProc _hookCallback;    #endregion    #region Properties    public bool IsStarted    {      get      {        return _isStarted;      }    }    #endregion    #region Constructor    public GlobalHook()    {      Application.ApplicationExit += new EventHandler(Application_ApplicationExit);    }    #endregion    #region Methods    public void Start()    {      if (!_isStarted &&        _hookType != 0)      {        // Make sure we keep a reference to this delegate!        // If not, GC randomly collects it, and a NullReference exception is thrown        _hookCallback = new HookProc(HookCallbackProcedure);        _handleToHook = SetWindowsHookEx(          _hookType,          _hookCallback,          //Marshal.GetHINSTANCE(Assembly.GetExecutingAssembly().GetModules()[0]),          0);          IntPtr.Zero;        // Were we able to sucessfully start hook?        if (_handleToHook != 0)        {          _isStarted = true;        }      }    }    public void Stop()    {      if (_isStarted)      {        UnhookWindowsHookEx(_handleToHook);        _isStarted = false;      }    }    protected virtual int HookCallbackProcedure(int nCode, Int32 wParam, IntPtr lParam)    {      // This method must be overriden by each extending hook      return 0;    }    protected void Application_ApplicationExit(object sender, EventArgs e)    {      if (_isStarted)      {        Stop();      }    }    #endregion  }}
using System;using System.Text;using System.Windows.Forms;using System.Runtime.InteropServices;namespace MouseKeyboardLibrary{  /// <summary>  /// Captures global keyboard events  /// </summary>  public class KeyboardHook : GlobalHook  {    #region Events    public event KeyEventHandler KeyDown;    public event KeyEventHandler KeyUp;    public event KeyPressEventHandler KeyPress;    #endregion    #region Constructor    public KeyboardHook()    {      _hookType = WH_KEYBOARD_LL;    }    #endregion    #region Methods    protected override int HookCallbackProcedure(int nCode, int wParam, IntPtr lParam)    {      bool handled = false;      if (nCode > -1 && (KeyDown != null || KeyUp != null || KeyPress != null))      {        KeyboardHookStruct keyboardHookStruct =          (KeyboardHookStruct)Marshal.PtrToStructure(lParam, typeof(KeyboardHookStruct));        // Is Control being held down?        bool control = ((GetKeyState(VK_LCONTROL) & 0x80) != 0) ||                ((GetKeyState(VK_RCONTROL) & 0x80) != 0);        // Is Shift being held down?        bool shift = ((GetKeyState(VK_LSHIFT) & 0x80) != 0) ||               ((GetKeyState(VK_RSHIFT) & 0x80) != 0);        // Is Alt being held down?        bool alt = ((GetKeyState(VK_LALT) & 0x80) != 0) ||              ((GetKeyState(VK_RALT) & 0x80) != 0);        // Is CapsLock on?        bool capslock = (GetKeyState(VK_CAPITAL) != 0);        // Create event using keycode and control/shift/alt values found above        KeyEventArgs e = new KeyEventArgs(          (Keys)(            keyboardHookStruct.vkCode |            (control ? (int)Keys.Control : 0) |            (shift ? (int)Keys.Shift : 0) |            (alt ? (int)Keys.Alt : 0)            ));        // Handle KeyDown and KeyUp events        switch (wParam)        {          case WM_KEYDOWN:          case WM_SYSKEYDOWN:            if (KeyDown != null)            {              KeyDown(this, e);              handled = handled || e.Handled;            }            break;          case WM_KEYUP:          case WM_SYSKEYUP:            if (KeyUp != null)            {              KeyUp(this, e);              handled = handled || e.Handled;            }            break;        }        // Handle KeyPress event        if (wParam == WM_KEYDOWN &&          !handled &&          !e.SuppressKeyPress &&          KeyPress != null)        {          byte[] keyState = new byte[256];          byte[] inBuffer = new byte[2];          GetKeyboardState(keyState);          if (ToAscii(keyboardHookStruct.vkCode,               keyboardHookStruct.scanCode,               keyState,               inBuffer,               keyboardHookStruct.flags) == 1)          {            char key = (char)inBuffer[0];            if ((capslock ^ shift) && Char.IsLetter(key))              key = Char.ToUpper(key);            KeyPressEventArgs e2 = new KeyPressEventArgs(key);            KeyPress(this, e2);            handled = handled || e.Handled;          }        }      }      if (handled)      {        return 1;      }      else      {        return CallNextHookEx(_handleToHook, nCode, wParam, lParam);      }    }    #endregion  }}
using System;using System.Text;using System.Runtime.InteropServices;using System.Windows.Forms;namespace MouseKeyboardLibrary{  /// <summary>  /// Standard Keyboard Shortcuts used by most applications  /// </summary>  public enum StandardShortcut  {    Copy,    Cut,    Paste,    SelectAll,    Save,    Open,    New,    Close,    Print  }  /// <summary>  /// Simulate keyboard key presses  /// </summary>  public static class KeyboardSimulator  {    #region Windows API Code    const int KEYEVENTF_EXTENDEDKEY = 0x1;    const int KEYEVENTF_KEYUP = 0x2;    [DllImport("user32.dll")]    static extern void keybd_event(byte key, byte scan, int flags, int extraInfo);    #endregion    #region Methods    public static void KeyDown(Keys key)    {      keybd_event(ParseKey(key), 0, 0, 0);    }    public static void KeyUp(Keys key)    {      keybd_event(ParseKey(key), 0, KEYEVENTF_KEYUP, 0);    }    public static void KeyPress(Keys key)    {      KeyDown(key);      KeyUp(key);    }    public static void SimulateStandardShortcut(StandardShortcut shortcut)    {      switch (shortcut)      {        case StandardShortcut.Copy:          KeyDown(Keys.Control);          KeyPress(Keys.C);          KeyUp(Keys.Control);          break;        case StandardShortcut.Cut:          KeyDown(Keys.Control);          KeyPress(Keys.X);          KeyUp(Keys.Control);          break;        case StandardShortcut.Paste:          KeyDown(Keys.Control);          KeyPress(Keys.V);          KeyUp(Keys.Control);          break;        case StandardShortcut.SelectAll:          KeyDown(Keys.Control);          KeyPress(Keys.A);          KeyUp(Keys.Control);          break;        case StandardShortcut.Save:          KeyDown(Keys.Control);          KeyPress(Keys.S);          KeyUp(Keys.Control);          break;        case StandardShortcut.Open:          KeyDown(Keys.Control);          KeyPress(Keys.O);          KeyUp(Keys.Control);          break;        case StandardShortcut.New:          KeyDown(Keys.Control);          KeyPress(Keys.N);          KeyUp(Keys.Control);          break;        case StandardShortcut.Close:          KeyDown(Keys.Alt);          KeyPress(Keys.F4);          KeyUp(Keys.Alt);          break;        case StandardShortcut.Print:          KeyDown(Keys.Control);          KeyPress(Keys.P);          KeyUp(Keys.Control);          break;      }    }    static byte ParseKey(Keys key)    {      // Alt, Shift, and Control need to be changed for API function to work with them      switch (key)      {        case Keys.Alt:          return (byte)18;        case Keys.Control:          return (byte)17;        case Keys.Shift:          return (byte)16;        default:          return (byte)key;      }    }    #endregion  }}
using System;using System.Text;using System.Windows.Forms;using System.Runtime.InteropServices;namespace MouseKeyboardLibrary{  /// <summary>  /// Captures global mouse events  /// </summary>  public class MouseHook : GlobalHook  {    #region MouseEventType Enum    private enum MouseEventType    {      None,      MouseDown,      MouseUp,      DoubleClick,      MouseWheel,      MouseMove    }    #endregion    #region Events    public event MouseEventHandler MouseDown;    public event MouseEventHandler MouseUp;    public event MouseEventHandler MouseMove;    public event MouseEventHandler MouseWheel;    public event EventHandler Click;    public event EventHandler DoubleClick;    #endregion    #region Constructor    public MouseHook()    {      _hookType = WH_MOUSE_LL;    }    #endregion    #region Methods    protected override int HookCallbackProcedure(int nCode, int wParam, IntPtr lParam)    {      if (nCode > -1 && (MouseDown != null || MouseUp != null || MouseMove != null))      {        MouseLLHookStruct mouseHookStruct =          (MouseLLHookStruct)Marshal.PtrToStructure(lParam, typeof(MouseLLHookStruct));        MouseButtons button = GetButton(wParam);        MouseEventType eventType = GetEventType(wParam);        MouseEventArgs e = new MouseEventArgs(          button,          (eventType == MouseEventType.DoubleClick ? 2 : 1),          mouseHookStruct.pt.x,          mouseHookStruct.pt.y,          (eventType == MouseEventType.MouseWheel ? (short)((mouseHookStruct.mouseData >> 16) & 0xffff) : 0));        // Prevent multiple Right Click events (this probably happens for popup menus)        if (button == MouseButtons.Right && mouseHookStruct.flags != 0)        {          eventType = MouseEventType.None;        }        switch (eventType)        {          case MouseEventType.MouseDown:            if (MouseDown != null)            {              MouseDown(this, e);            }            break;          case MouseEventType.MouseUp:            if (Click != null)            {              Click(this, new EventArgs());            }            if (MouseUp != null)            {              MouseUp(this, e);            }            break;          case MouseEventType.DoubleClick:            if (DoubleClick != null)            {              DoubleClick(this, new EventArgs());            }            break;          case MouseEventType.MouseWheel:            if (MouseWheel != null)            {              MouseWheel(this, e);            }            break;          case MouseEventType.MouseMove:            if (MouseMove != null)            {              MouseMove(this, e);            }            break;          default:            break;        }      }      return CallNextHookEx(_handleToHook, nCode, wParam, lParam);    }    private MouseButtons GetButton(Int32 wParam)    {      switch (wParam)      {        case WM_LBUTTONDOWN:        case WM_LBUTTONUP:        case WM_LBUTTONDBLCLK:          return MouseButtons.Left;        case WM_RBUTTONDOWN:        case WM_RBUTTONUP:        case WM_RBUTTONDBLCLK:          return MouseButtons.Right;        case WM_MBUTTONDOWN:        case WM_MBUTTONUP:        case WM_MBUTTONDBLCLK:          return MouseButtons.Middle;        default:          return MouseButtons.None;      }    }    private MouseEventType GetEventType(Int32 wParam)    {      switch (wParam)      {        case WM_LBUTTONDOWN:        case WM_RBUTTONDOWN:        case WM_MBUTTONDOWN:          return MouseEventType.MouseDown;        case WM_LBUTTONUP:        case WM_RBUTTONUP:        case WM_MBUTTONUP:          return MouseEventType.MouseUp;        case WM_LBUTTONDBLCLK:        case WM_RBUTTONDBLCLK:        case WM_MBUTTONDBLCLK:          return MouseEventType.DoubleClick;        case WM_MOUSEWHEEL:          return MouseEventType.MouseWheel;        case WM_MOUSEMOVE:          return MouseEventType.MouseMove;        default:          return MouseEventType.None;      }    }    #endregion  }}
using System;using System.Text;using System.Runtime.InteropServices;using System.Drawing;using System.Windows.Forms;namespace MouseKeyboardLibrary{  /// <summary>  /// And X, Y point on the screen  /// </summary>  public struct MousePoint  {    public MousePoint(Point p)    {      X = p.X;      Y = p.Y;    }    public int X;    public int Y;    public static implicit operator Point(MousePoint p)    {      return new Point(p.X, p.Y);    }  }  /// <summary>  /// Mouse buttons that can be pressed  /// </summary>  public enum MouseButton  {    Left = 0x2,    Right = 0x8,    Middle = 0x20  }  /// <summary>  /// Operations that simulate mouse events  /// </summary>  public static class MouseSimulator  {    #region Windows API Code    [DllImport("user32.dll")]    static extern int ShowCursor(bool show);    [DllImport("user32.dll")]    static extern void mouse_event(int flags, int dX, int dY, int buttons, int extraInfo);    const int MOUSEEVENTF_MOVE = 0x1;    const int MOUSEEVENTF_LEFTDOWN = 0x2;    const int MOUSEEVENTF_LEFTUP = 0x4;    const int MOUSEEVENTF_RIGHTDOWN = 0x8;    const int MOUSEEVENTF_RIGHTUP = 0x10;    const int MOUSEEVENTF_MIDDLEDOWN = 0x20;    const int MOUSEEVENTF_MIDDLEUP = 0x40;    const int MOUSEEVENTF_WHEEL = 0x800;    const int MOUSEEVENTF_ABSOLUTE = 0x8000;    #endregion    #region Properties    /// <summary>    /// Gets or sets a structure that represents both X and Y mouse coordinates    /// </summary>    public static MousePoint Position    {      get      {        return new MousePoint(Cursor.Position);      }      set      {        Cursor.Position = value;      }    }    /// <summary>    /// Gets or sets only the mouse's x coordinate    /// </summary>    public static int X    {      get      {        return Cursor.Position.X;      }      set      {        Cursor.Position = new Point(value, Y);      }    }    /// <summary>    /// Gets or sets only the mouse's y coordinate    /// </summary>    public static int Y    {      get      {        return Cursor.Position.Y;      }      set      {        Cursor.Position = new Point(X, value);      }    }    #endregion    #region Methods    /// <summary>    /// Press a mouse button down    /// </summary>    /// <param name="button"></param>    public static void MouseDown(MouseButton button)    {      mouse_event(((int)button), 0, 0, 0, 0);    }    public static void MouseDown(MouseButtons button)    {      switch (button)      {        case MouseButtons.Left:          MouseDown(MouseButton.Left);          break;        case MouseButtons.Middle:          MouseDown(MouseButton.Middle);          break;        case MouseButtons.Right:          MouseDown(MouseButton.Right);          break;      }    }    /// <summary>    /// Let a mouse button up    /// </summary>    /// <param name="button"></param>    public static void MouseUp(MouseButton button)    {      mouse_event(((int)button) * 2, 0, 0, 0, 0);    }    public static void MouseUp(MouseButtons button)    {      switch (button)      {        case MouseButtons.Left:          MouseUp(MouseButton.Left);          break;        case MouseButtons.Middle:          MouseUp(MouseButton.Middle);          break;        case MouseButtons.Right:          MouseUp(MouseButton.Right);          break;      }    }    /// <summary>    /// Click a mouse button (down then up)    /// </summary>    /// <param name="button"></param>    public static void Click(MouseButton button)    {      MouseDown(button);      MouseUp(button);    }    public static void Click(MouseButtons button)    {      switch (button)      {        case MouseButtons.Left:          Click(MouseButton.Left);          break;        case MouseButtons.Middle:          Click(MouseButton.Middle);          break;        case MouseButtons.Right:          Click(MouseButton.Right);          break;      }    }    /// <summary>    /// Double click a mouse button (down then up twice)    /// </summary>    /// <param name="button"></param>    public static void DoubleClick(MouseButton button)    {      Click(button);      Click(button);    }    public static void DoubleClick(MouseButtons button)    {      switch (button)      {        case MouseButtons.Left:          DoubleClick(MouseButton.Left);          break;        case MouseButtons.Middle:          DoubleClick(MouseButton.Middle);          break;        case MouseButtons.Right:          DoubleClick(MouseButton.Right);          break;      }    }    /// <summary>    /// Show a hidden current on currently application    /// </summary>    public static void Show()    {      ShowCursor(true);    }    /// <summary>    /// Hide mouse cursor only on current application's forms    /// </summary>    public static void Hide()    {      ShowCursor(false);    }    #endregion  }}
using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing;using System.Linq;using System.Text;using System.Windows.Forms;using MouseKeyboardLibrary;namespace SampleApplication{  /*   上面的5個類編譯成Dll引用,使用例子   */  public partial class HookTestForm : Form  {    MouseHook mouseHook = new MouseHook();    KeyboardHook keyboardHook = new KeyboardHook();    public HookTestForm()    {      InitializeComponent();    }    private void TestForm_Load(object sender, EventArgs e)    {      mouseHook.MouseMove += new MouseEventHandler(mouseHook_MouseMove);      mouseHook.MouseDown += new MouseEventHandler(mouseHook_MouseDown);      mouseHook.MouseUp += new MouseEventHandler(mouseHook_MouseUp);      mouseHook.MouseWheel += new MouseEventHandler(mouseHook_MouseWheel);      keyboardHook.KeyDown += new KeyEventHandler(keyboardHook_KeyDown);      keyboardHook.KeyUp += new KeyEventHandler(keyboardHook_KeyUp);      keyboardHook.KeyPress += new KeyPressEventHandler(keyboardHook_KeyPress);      mouseHook.Start();      keyboardHook.Start();      SetXYLabel(MouseSimulator.X, MouseSimulator.Y);    }    void keyboardHook_KeyPress(object sender, KeyPressEventArgs e)    {      AddKeyboardEvent(        "KeyPress",        "",        e.KeyChar.ToString(),        "",        "",        ""        );    }    void keyboardHook_KeyUp(object sender, KeyEventArgs e)    {      AddKeyboardEvent(        "KeyUp",        e.KeyCode.ToString(),        "",        e.Shift.ToString(),        e.Alt.ToString(),        e.Control.ToString()        );    }    void keyboardHook_KeyDown(object sender, KeyEventArgs e)    {      AddKeyboardEvent(        "KeyDown",        e.KeyCode.ToString(),        "",        e.Shift.ToString(),        e.Alt.ToString(),        e.Control.ToString()        );    }    void mouseHook_MouseWheel(object sender, MouseEventArgs e)    {      AddMouseEvent(        "MouseWheel",        "",        "",        "",        e.Delta.ToString()        );    }    void mouseHook_MouseUp(object sender, MouseEventArgs e)    {      AddMouseEvent(        "MouseUp",        e.Button.ToString(),        e.X.ToString(),        e.Y.ToString(),        ""        );    }    void mouseHook_MouseDown(object sender, MouseEventArgs e)    {      AddMouseEvent(        "MouseDown",        e.Button.ToString(),        e.X.ToString(),        e.Y.ToString(),        ""        );    }    void mouseHook_MouseMove(object sender, MouseEventArgs e)    {      SetXYLabel(e.X, e.Y);    }    void SetXYLabel(int x, int y)    {      curXYLabel.Text = String.Format("Current Mouse Point: X={0}, y={1}", x, y);    }    void AddMouseEvent(string eventType, string button, string x, string y, string delta)    {      listView1.Items.Insert(0,        new ListViewItem(          new string[]{            eventType,            button,            x,            y,            delta          }));    }    void AddKeyboardEvent(string eventType, string keyCode, string keyChar, string shift, string alt, string control)    {      listView2.Items.Insert(0,         new ListViewItem(           new string[]{            eventType,            keyCode,            keyChar,            shift,            alt,            control        }));    }    private void TestForm_FormClosed(object sender, FormClosedEventArgs e)    {      // Not necessary anymore, will stop when application exits      //mouseHook.Stop();      //keyboardHook.Stop();    }  }}

更多關于C#相關內容感興趣的讀者可查看本站專題:《C#常見控件用法教程》、《WinForm控件用法總結》、《C#數據結構與算法教程》、《C#面向對象程序設計入門教程》及《C#程序設計之線程使用技巧總結

希望本文所述對大家C#程序設計有所幫助。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
一区二区亚洲欧洲国产日韩| 奇米一区二区三区四区久久| 欧美重口另类videos人妖| 日韩在线视频免费观看高清中文| 亚洲最大福利视频| 国产精品日韩在线播放| 久久久日本电影| 中文字幕不卡在线视频极品| 欧美成人激情视频免费观看| 日韩精品福利在线| 国产精品九九久久久久久久| 日韩一级裸体免费视频| 国产精品永久免费在线| 91青草视频久久| 欧美老肥婆性猛交视频| 欧美日韩国产精品一区二区不卡中文| 亚洲大胆人体在线| 亚洲最大福利网| www.欧美三级电影.com| 久久久久久久999精品视频| 亚洲天堂av在线免费| 日本久久久久久久久久久| 久久精品国产一区二区电影| 伊人久久免费视频| 中文字幕av一区| 日韩在线一区二区三区免费视频| 欧美视频在线观看免费网址| 国产亚洲精品91在线| 国产91网红主播在线观看| 理论片在线不卡免费观看| 亚洲国产精品久久| 欧美午夜精品久久久久久人妖| 精品美女久久久久久免费| 日韩电影在线观看永久视频免费网站| 成人精品久久av网站| 97免费在线视频| 亚洲成人中文字幕| 国产在线拍揄自揄视频不卡99| 亚洲国产精品小视频| 国产精品久久视频| 在线视频免费一区二区| 亚洲国产成人一区| 国产精品视频网址| 国产精品美女免费视频| 亚洲第一网站免费视频| 尤物精品国产第一福利三区| 92看片淫黄大片欧美看国产片| 欧美麻豆久久久久久中文| 久久久亚洲福利精品午夜| 成人乱色短篇合集| 日韩在线视频免费观看高清中文| 国产成人精品视| 亚洲国产日韩精品在线| 欧美日韩黄色大片| 81精品国产乱码久久久久久| 国内精品久久久久影院 日本资源| 亚洲一区二区三区成人在线视频精品| 日韩欧美中文在线| 色综合久久88色综合天天看泰| 欧美黄色免费网站| 美女视频黄免费的亚洲男人天堂| 国产欧美 在线欧美| 久久电影一区二区| 亚洲成人激情视频| 国产精品热视频| 4k岛国日韩精品**专区| 亚洲缚视频在线观看| 亚洲字幕在线观看| 92看片淫黄大片看国产片| 最近2019中文免费高清视频观看www99| 久久久久久香蕉网| 欧美黑人巨大xxx极品| 91成人在线视频| 亚洲综合色激情五月| 国产精品午夜一区二区欲梦| 久久久午夜视频| 亚洲第一av网| 欧美激情2020午夜免费观看| 欧美一区二区.| 亚洲色图综合网| 成人午夜两性视频| 久久综合九色九九| 久久精品国产2020观看福利| 麻豆精品精华液| 国产午夜精品美女视频明星a级| 国产精品日韩在线一区| 欧美激情一区二区三区高清视频| 亚洲高清色综合| 日韩成人中文字幕在线观看| 欧美在线观看一区二区三区| 亚洲性视频网站| 欧美在线观看一区二区三区| 日韩欧美在线播放| 国产日韩欧美在线观看| 欧美大全免费观看电视剧大泉洋| 欧美日韩国内自拍| 国产欧美一区二区三区视频| 亚洲国产成人一区| 在线视频欧美日韩精品| 欧美亚洲成人精品| 欧美精品免费在线观看| 国产精品大陆在线观看| 性欧美长视频免费观看不卡| 在线观看国产精品日韩av| 久久亚洲精品视频| 精品久久久久久国产91| 98精品国产自产在线观看| 亚洲综合色激情五月| 日本电影亚洲天堂| 国产美女久久精品香蕉69| 欧美在线欧美在线| 亚洲石原莉奈一区二区在线观看| 91久久嫩草影院一区二区| 成人妇女淫片aaaa视频| 热99在线视频| 亚洲国产精品va在线观看黑人| 亚洲第一精品夜夜躁人人爽| 一个人看的www欧美| 欧美亚洲视频在线观看| 国产福利视频一区| 91最新国产视频| 国产性色av一区二区| 日本精品久久久久影院| 亚洲国产精品视频在线观看| 亚洲欧美中文字幕| 国产99视频精品免视看7| 亚洲毛茸茸少妇高潮呻吟| 国产精品日韩av| 亚洲天堂av在线免费观看| 欧美裸体xxxxx| 午夜精品一区二区三区视频免费看| 国产精品精品视频一区二区三区| 国产精品白丝av嫩草影院| 亚洲欧美国产一本综合首页| 亚洲黄色av网站| 在线视频欧美日韩精品| 欧美区二区三区| 亚洲综合视频1区| 69久久夜色精品国产7777| 亚洲男女性事视频| 亚洲美女又黄又爽在线观看| 日韩麻豆第一页| 日韩在线一区二区三区免费视频| 91精品国产高清自在线看超| 国产欧美日韩丝袜精品一区| 国语自产精品视频在免费| 欧美亚洲激情在线| 亚洲尤物视频网| 日韩一二三在线视频播| 欧美性一区二区三区| 国产成人91久久精品| 国产精品久久久999| 国产精品福利小视频| 久久久亚洲影院| 91免费看视频.| 69国产精品成人在线播放| 国色天香2019中文字幕在线观看| 国产午夜精品全部视频播放| 亚洲男人天堂九九视频| 88xx成人精品| 欧美最顶级丰满的aⅴ艳星| 精品偷拍各种wc美女嘘嘘| 欧美精品久久久久a| 国产热re99久久6国产精品|