使用 python 在 Windows 中更改鼠标指针速度
Change mouse pointer speed in Windows using python
我正在使用 Windows10 系统。
我有一个 Tkinter canvas,上面画了一个图像。当鼠标悬停在 canvas 上时,有什么办法可以减慢鼠标指针的速度吗?
我已经查看 this link and this link 但答案似乎不稳定..
更具体地说,是否可以在普通 Python/Tkinter 中减慢鼠标指针速度?
答案是"yes",但是有风险。您 可以 通过编写控制位置的算法来减慢或加快鼠标的速度。这种方法很麻烦,很可能容易出错。此方法将利用 tkinter 的 event_generate 函数。
root.event_generate('<Motion>', warp=True, x=xptr, y=yptr)
其中 root 是根(或任何 tk)window,xptr、yptr 是将鼠标光标强制移动到特定屏幕位置的屏幕坐标。
第二个选项也很麻烦,容易出错,但风险更大。此方法与编辑 Windows 注册表有关。注册表项很容易找到:HKEY_CURRENT_USER\Control Panel\Mouse
。但请注意:对这些注册表项的任何更改都会影响所有程序。你可以read this MSDN article for some recommended settings。使用 python 注册表模块更改注册表项。但是一定要为你的程序应用良好的错误处理和退出控制,因为你需要将你在注册表中所做的任何更改恢复到原来的状态。如果您的程序在重置注册表项之前崩溃,那么您必须手动重置它们,除非您编写一个程序将它们设置为一些默认值。
祝你好运!
在 windows 系统上,您可以使用本机 SystemParametersInfo
to change speed of the mouse pointer. It's possible to implement via ctype
,它是 Python 标准库的一部分(它算作 "plain" 解决方案吗?)。
看看这个片段:
import ctypes
try:
import tkinter as tk
except ImportError:
import Tkinter as tk
def change_speed(speed=10):
# 1 - slow
# 10 - standard
# 20 - fast
set_mouse_speed = 113 # 0x0071 for SPI_SETMOUSESPEED
ctypes.windll.user32.SystemParametersInfoA(set_mouse_speed, 0, speed, 0)
def proper_close():
change_speed()
root.destroy()
root = tk.Tk()
root.protocol('WM_DELETE_WINDOW', proper_close)
tk.Button(root, text='Slow', command=lambda: change_speed(1)).pack(expand=True, fill='x')
tk.Button(root, text='Standard', command=change_speed).pack(expand=True, fill='x')
tk.Button(root, text='Fast', command=lambda: change_speed(20)).pack(expand=True, fill='x')
root.mainloop()
但是如果我们的 "standard" 速度不等于 10
怎么办?没问题!看看这个片段:
import ctypes
try:
import tkinter as tk
except ImportError:
import Tkinter as tk
def change_speed(speed):
# 1 - slow
# 10 - standard
# 20 - fast
set_mouse_speed = 113 # 0x0071 for SPI_SETMOUSESPEED
ctypes.windll.user32.SystemParametersInfoA(set_mouse_speed, 0, speed, 0)
def get_current_speed():
get_mouse_speed = 112 # 0x0070 for SPI_GETMOUSESPEED
speed = ctypes.c_int()
ctypes.windll.user32.SystemParametersInfoA(get_mouse_speed, 0, ctypes.byref(speed), 0)
return speed.value
def proper_close():
change_speed(standard_speed)
root.destroy()
root = tk.Tk()
root.protocol('WM_DELETE_WINDOW', proper_close)
root.minsize(width=640, height=480)
standard_speed = get_current_speed()
safe_zone = tk.LabelFrame(root, text='Safe Zone', bg='green')
slow_zone = tk.LabelFrame(root, text='Slow Zone', bg='red')
safe_zone.pack(side='left', expand=True, fill='both')
slow_zone.pack(side='left', expand=True, fill='both')
slow_zone.bind('<Enter>', lambda event: change_speed(1))
slow_zone.bind('<Leave>', lambda event: change_speed(standard_speed))
root.mainloop()
换句话说 - 这根本不是一项艰巨的任务。我们以 getting/setting 鼠标速度免费,无需在注册表处爬行,也无需火箭科学计算!
有关 SystemParametersInfo
的更多信息,您可以在 MSDN 上找到。
我正在使用 Windows10 系统。
我有一个 Tkinter canvas,上面画了一个图像。当鼠标悬停在 canvas 上时,有什么办法可以减慢鼠标指针的速度吗? 我已经查看 this link and this link 但答案似乎不稳定..
更具体地说,是否可以在普通 Python/Tkinter 中减慢鼠标指针速度?
答案是"yes",但是有风险。您 可以 通过编写控制位置的算法来减慢或加快鼠标的速度。这种方法很麻烦,很可能容易出错。此方法将利用 tkinter 的 event_generate 函数。
root.event_generate('<Motion>', warp=True, x=xptr, y=yptr)
其中 root 是根(或任何 tk)window,xptr、yptr 是将鼠标光标强制移动到特定屏幕位置的屏幕坐标。
第二个选项也很麻烦,容易出错,但风险更大。此方法与编辑 Windows 注册表有关。注册表项很容易找到:HKEY_CURRENT_USER\Control Panel\Mouse
。但请注意:对这些注册表项的任何更改都会影响所有程序。你可以read this MSDN article for some recommended settings。使用 python 注册表模块更改注册表项。但是一定要为你的程序应用良好的错误处理和退出控制,因为你需要将你在注册表中所做的任何更改恢复到原来的状态。如果您的程序在重置注册表项之前崩溃,那么您必须手动重置它们,除非您编写一个程序将它们设置为一些默认值。
祝你好运!
在 windows 系统上,您可以使用本机 SystemParametersInfo
to change speed of the mouse pointer. It's possible to implement via ctype
,它是 Python 标准库的一部分(它算作 "plain" 解决方案吗?)。
看看这个片段:
import ctypes
try:
import tkinter as tk
except ImportError:
import Tkinter as tk
def change_speed(speed=10):
# 1 - slow
# 10 - standard
# 20 - fast
set_mouse_speed = 113 # 0x0071 for SPI_SETMOUSESPEED
ctypes.windll.user32.SystemParametersInfoA(set_mouse_speed, 0, speed, 0)
def proper_close():
change_speed()
root.destroy()
root = tk.Tk()
root.protocol('WM_DELETE_WINDOW', proper_close)
tk.Button(root, text='Slow', command=lambda: change_speed(1)).pack(expand=True, fill='x')
tk.Button(root, text='Standard', command=change_speed).pack(expand=True, fill='x')
tk.Button(root, text='Fast', command=lambda: change_speed(20)).pack(expand=True, fill='x')
root.mainloop()
但是如果我们的 "standard" 速度不等于 10
怎么办?没问题!看看这个片段:
import ctypes
try:
import tkinter as tk
except ImportError:
import Tkinter as tk
def change_speed(speed):
# 1 - slow
# 10 - standard
# 20 - fast
set_mouse_speed = 113 # 0x0071 for SPI_SETMOUSESPEED
ctypes.windll.user32.SystemParametersInfoA(set_mouse_speed, 0, speed, 0)
def get_current_speed():
get_mouse_speed = 112 # 0x0070 for SPI_GETMOUSESPEED
speed = ctypes.c_int()
ctypes.windll.user32.SystemParametersInfoA(get_mouse_speed, 0, ctypes.byref(speed), 0)
return speed.value
def proper_close():
change_speed(standard_speed)
root.destroy()
root = tk.Tk()
root.protocol('WM_DELETE_WINDOW', proper_close)
root.minsize(width=640, height=480)
standard_speed = get_current_speed()
safe_zone = tk.LabelFrame(root, text='Safe Zone', bg='green')
slow_zone = tk.LabelFrame(root, text='Slow Zone', bg='red')
safe_zone.pack(side='left', expand=True, fill='both')
slow_zone.pack(side='left', expand=True, fill='both')
slow_zone.bind('<Enter>', lambda event: change_speed(1))
slow_zone.bind('<Leave>', lambda event: change_speed(standard_speed))
root.mainloop()
换句话说 - 这根本不是一项艰巨的任务。我们以 getting/setting 鼠标速度免费,无需在注册表处爬行,也无需火箭科学计算!
有关 SystemParametersInfo
的更多信息,您可以在 MSDN 上找到。