Python监听键盘和鼠标事件的示例代码

我们可以利用windows提供的api函数来实现对系统键盘事件和鼠标事件的监听,主要利用的是SetWindowsHookEx函数,这个函数可以允许调用者传入一个钩子函数也叫回调函数,当指定的事件发生时,你

传入的函数就会被触发,有些事件是进程级的,有些事件是系统级的,这里我们用WH_KEYBOARD_LL来监听系统键盘事件,用WH_MOUSE_LL来监听鼠标事件,注意不是WH_KEYBOARD,使用WH_KEYBOARD是无法监听到外部

程序的事件的,这个可以在windows官方文档里面看到说明,要用WH_KEYBOARD来监听系统键盘必须写dll去实现。

因为用到了一些宏定义在win32con里面已经有了,所以需要安装一下pypiwin32,当然如果你将这些宏定义写在自己的文件中,那么就不用安装pypiwin32了。

安装pypiwin32

pip install pypiwin32
# coding=utf-8
from ctypes import *
from ctypes import wintypes
import win32con

SetWindowsHookEx=windll.user32.SetWindowsHookExA
UnhookWindowsHookEx=windll.user32.UnhookWindowsHookEx
CallNextHookEx=windll.user32.CallNextHookEx
GetMessage=windll.user32.GetMessageA
GetModuleHandle=windll.kernel32.GetModuleHandleW
#保存键盘钩子函数句柄
keyboard_hd = None
#保存鼠标钩子函数句柄
mouse_hd = None

class KBDLLHOOKSTRUCT(Structure):
  _fields_ = [
    ('vkCode',c_int),
    ('scanCode', c_int),
    ('flags', c_int),
    ('time', c_int),
    ('dwExtraInfo', c_uint),
    ('',c_void_p)
  ]

class POINT(Structure):
  _fields_ = [
    ('x',c_long),
    ('y',c_long)
  ]

class MSLLHOOKSTRUCT(Structure):
  _fields_ = [
    ('pt',POINT),
    ('hwnd',c_int),
    ('wHitTestCode',c_uint),
    ('dwExtraInfo',c_uint),
  ]

def wait_for_msg():
  msg = wintypes.MSG()
  GetMessage(msg, 0, 0, 0)

def keyboard_pro(nCode, wParam, lParam):
  """
  函数功能:键盘钩子函数,当有按键按下时此函数被回调
  """
  if nCode == win32con.HC_ACTION:
    KBDLLHOOKSTRUCT_p = POINTER(KBDLLHOOKSTRUCT)
    param=cast(lParam,KBDLLHOOKSTRUCT_p)
    print(param.contents.vkCode)
  return CallNextHookEx(keyboard_hd, nCode, wParam, lParam)

def start_keyboard_hook():
  """
  函数功能:启动键盘监听
  """
  HOOKPROTYPE = CFUNCTYPE(c_int, c_int, c_int, POINTER(c_void_p))
  pointer = HOOKPROTYPE(keyboard_pro)
  keyboard_hd = SetWindowsHookEx(
    win32con.WH_KEYBOARD_LL,
    pointer,
    GetModuleHandle(None),
    0)
  wait_for_msg()

def stop_keyboard_hook():
  """
  函数功能:停止键盘监听
  """
  UnhookWindowsHookEx(keyboard_hd)

def mouse_pro(nCode, wParam, lParam):
  """
  函数功能:鼠标钩子函数,当有鼠标事件,此函数被回调
  """
  if nCode == win32con.HC_ACTION:
    MSLLHOOKSTRUCT_p = POINTER(MSLLHOOKSTRUCT)
    param=cast(lParam,MSLLHOOKSTRUCT_p)
    #鼠标左键点击
    if wParam == win32con.WM_LBUTTONDOWN:
      print("左键点击,坐标:x:%d,y:%d" % (param.contents.pt.x,param.contents.pt.y))
    elif wParam == win32con.WM_LBUTTONUP:
      print("左键抬起,坐标:x:%d,y:%d" % (param.contents.pt.x, param.contents.pt.y))
    elif wParam == win32con.WM_MOUSEMOVE:
      print("鼠标移动,坐标:x:%d,y:%d" % (param.contents.pt.x, param.contents.pt.y))
    elif wParam == win32con.WM_RBUTTONDOWN:
      print("右键点击,坐标:x:%d,y:%d" % (param.contents.pt.x, param.contents.pt.y))
    elif wParam == win32con.WM_RBUTTONUP:
      print("右键抬起,坐标:x:%d,y:%d" % (param.contents.pt.x, param.contents.pt.y))
  return CallNextHookEx(mouse_hd, nCode, wParam, lParam)

def start_mouse_hook():
  """
  函数功能:启动鼠标监听
  """
  HOOKPROTYPE = CFUNCTYPE(c_int, c_int, c_int, POINTER(c_void_p))
  pointer = HOOKPROTYPE(mouse_pro)
  mouse_hd = SetWindowsHookEx(
    win32con.WH_MOUSE_LL,
    pointer,
    GetModuleHandle(None),
    0)
  wait_for_msg()

def stop_mouse_hook():
  """
  函数功能:停止鼠标监听
  """
  UnhookWindowsHookEx(mouse_hd)

测试代码:

import HookApi

if __name__== '__main__':
  HookApi.start_keyboard_hook()

运行效果

以上就是Python监听键盘和鼠标事件的示例代码的详细内容,更多关于Python监听键盘和鼠标事件的资料请关注我们其它相关文章!

(0)

相关推荐

  • python实现监听键盘

    python实现监听键盘,供大家参考,具体内容如下实现服务端 import pickle from io import BytesIO import socket #接收数据 def Server_Recive(ip,port): socket_obj = socket.socket(socket.AF_INET,socket.SOCK_STREAM) socket_obj.bind((ip,port)) socket_obj.listen(5) file = 1 while True: con

  • Python监听键盘和鼠标事件的示例代码

    我们可以利用windows提供的api函数来实现对系统键盘事件和鼠标事件的监听,主要利用的是SetWindowsHookEx函数,这个函数可以允许调用者传入一个钩子函数也叫回调函数,当指定的事件发生时,你 传入的函数就会被触发,有些事件是进程级的,有些事件是系统级的,这里我们用WH_KEYBOARD_LL来监听系统键盘事件,用WH_MOUSE_LL来监听鼠标事件,注意不是WH_KEYBOARD,使用WH_KEYBOARD是无法监听到外部 程序的事件的,这个可以在windows官方文档里面看到说明

  • Python爬虫之Selenium鼠标事件的实现

    一.常用方法 函数名 说明 click(on_element=None) 点击鼠标右键 click_and_hold(on_element=None) 点击鼠标左键,不松开 release(on_element=None) 在某个元素位置松开鼠标左键 context_click(on_element=None) 点击鼠标右键 double_click(on_element=None) 双击鼠标左键 drag_and_drop(source, target) 拖拽到某个元素然后松开 drag_an

  • Python捕捉和模拟鼠标事件的方法

    本文实例讲述了Python捕捉和模拟鼠标事件的方法.分享给大家供大家参考.具体分析如下: 这个假期玩了不少galgame,不过有些很老的游戏没有自动运行模式,点击鼠标又太伤按键了,于是想把滚动鼠标滚轮映射为点击鼠标. 网上搜了一下,没发现什么现成的软件,而按键精灵又太重量级了,于是考虑干脆自己用Python写个算了. 这里需要把PyHook和PyWin32都装上(建议下exe版,免得安装时各种蛋疼). 翻了翻教程,发现实现起来很简单: # -*- coding: utf-8 -*- import

  • 使用JS监听键盘按下事件(keydown event)

    1.监听全局键盘按下事件,例如监听全局回车事件 $(document).keydown(function(event){ if(event.keyCode == 13){ alert('你按下了Enter'); } }); 2.监听某个组件键盘按下事件,例如监听id为btn的button组件的回车按下事件 $("#btn").keydown(function(event){ if(event.keyCode==13){ alert('你按下了Enter'); } }); 3.如果是要监

  • Python实现自动打开电脑应用的示例代码

    由于时间原因,有时候可能会错过某个上网课的时间段.因此想要实现自动定时启动DingDing. 新手一枚,如有不当勿喷望大佬指正. 自动打开DingDing可以由两种方法实现: 通过找出找出软件在电脑中快捷方式的位置(电脑屏幕中的坐标),使用代码模拟鼠标进行双击打开. 通过输入软件在电脑中的安装路径打开软件. 1.第一种方法: ​在python中,使用pip install pyautogui 安装第三方库,在此库中,可以使用pyautogui.position()获取当前鼠标放置位置的坐标.我们

  • Python实现清理重复文件功能的示例代码

    目录 前置 查找.删除重复文件 GUI制作 GUI界面设计 逻辑设计 效果展示 在电脑上或多或少的存在一些重复文件,体积小的倒没什么,如果体积大的就很占内存了,而如果自己一个一个查看文件是否重复,然后再删除,还是很要命的. 为此,我用python制作了一个删除重复文件的小工具,核心代码很简单,就十行代码,不管什么类型的文件都可以一键删除! 前置 PySimpleGUI库用来创建可视化界面,os操作文件,只需要这两个库: import os import PySimpleGUI as sg os为

  • Python小程序 控制鼠标循环点击代码实例

    这篇文章主要介绍了Python小程序 控制鼠标循环点击代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 from ctypes import * import pyautogui import time time.sleep(5) while 1: pyautogui.click(400, 400, clicks=1, interval=0.0, button='left') time.sleep(10) Note: 坐标(400,400

  • Python聊天室带界面实现的示例代码(tkinter,Mysql,Treading,socket)

    一.前言 我用的是面向对象写的,把界面功能模块封装成类,然后在客户端创建对象然后进行调用.好处就是方便我们维护代码以及把相应的信息封装起来,每一个实例都是各不相同的. 所有的界面按钮处理事件都在客户端,在创建界面对象是会把客户端的处理事件函数作为创建对象的参数,之后再按钮上绑定这个函数,当点击按钮时便会回调函数 二.登录界面实现 登录界面模块chat_login_panel.py from tkinter import * # 导入模块,用户创建GUI界面 # 登陆界面类 class Login

  • python中Tkinter实现分页标签的示例代码

    Tkinter实现UI分页标签显示: Input页,红色部分为当前Frame的位置,下半部分为第一页的子标签:三页标签的显示内容各不相同.实现分页显示的核心组件为Radiobutton,Radiobutton只有一个选项能够生效,使用参数indicatoron=0能够将Radiobutton显示为Button的形状,通过选定的Radiobutton将原有的Frame forget掉,同时,将预定的Frame pack,实现分页的效果.使用时要将更换的组件放入一个Frame中,定义一个函数进行选定

  • python 模拟在天空中放风筝的示例代码

    1 前言 昨天是农历的三月初三,相传这一天是轩辕黄帝的诞辰日.春秋时期,三月初三的纪念活动还是非常隆重的,至魏晋则演变为达官显贵.文人雅士临水宴饮的节日.兰亭序中提到的"曲水流觞",也许就是这一习俗的写照吧(个人猜想,未经考证).唐以后,三月初三渐渐湮没于历史的长河中. 于我而言,三月初三却是一个放风筝的日子.每逢这一天,耳边总会响起一首老歌:又是一年三月三,风筝飞满天--上班路上,看道路两侧草长莺飞.杨柳拂面,一时玩心顿起:何不用3D构造一个天上白云飘飘,地上绿草茵茵的虚幻空间,在里

随机推荐