Tkinter 透视 window 不受鼠标点击影响
Tkinter see through window not affected by mouse clicks
我目前正在使用 python 通过发送鼠标和击键命令来控制游戏。我想要做的是让一个透明的 Tkinter window 位于游戏之上以提供一些信息,例如鼠标位置和像素颜色。
我熟悉更改 window 的 alpha 属性以使其透明,但不知道如何始终将 window 保持在前面并让鼠标点击通过它。
我目前控制游戏的方法包括在某些位置截屏并分析颜色内容。我还需要一些方法在没有 Tkinter window 干扰的情况下做到这一点。
Pysscreenshot用于截图
win32api用于点击
谢谢,
亚历克
您可以使用win32gui
模块的SetWindowLong
功能。如果你想通过 window 进行透明点击,你必须在我们的 window 上应用 GWL_EXSTYLE
。因此,您需要 Window.
的 window 句柄
hwnd = win32gui.FindWindow(None, "Your window title") # Getting window handle
# hwnd = root.winfo_id() getting hwnd with Tkinter windows
# hwnd = root.GetHandle() getting hwnd with wx windows
lExStyle = win32gui.GetWindowLong(hwnd, win32con.GWL_EXSTYLE)
lExStyle |= win32con.WS_EX_TRANSPARENT | win32con.WS_EX_LAYERED
win32gui.SetWindowLong(hwnd, win32con.GWL_EXSTYLE , lExStyle )
如果您想通过 winapi 更改 window 的透明度,请使用 SetLayeredWindowAttributes
。
编辑:始终在顶部透明的叠加层示例代码 window,它通过点击传递。它获取当前桌面图像并创建透明叠加层,因此您可以享受桌面背景图像。
from win32api import GetSystemMetrics
import win32con
import win32gui
import wx
def scale_bitmap(bitmap, width, height):
image = wx.ImageFromBitmap(bitmap)
image = image.Scale(width, height, wx.IMAGE_QUALITY_HIGH)
result = wx.BitmapFromImage(image)
return result
app = wx.App()
trans = 50
# create a window/frame, no parent, -1 is default ID
# change the size of the frame to fit the backgound images
frame1 = wx.Frame(None, -1, "KEA", style=wx.CLIP_CHILDREN | wx.STAY_ON_TOP)
# create the class instance
frame1.ShowFullScreen(True)
image_file = win32gui.SystemParametersInfo(win32con.SPI_GETDESKWALLPAPER,0,0)
bmp1 = wx.Image(image_file, wx.BITMAP_TYPE_ANY).ConvertToBitmap()
bmp1 = scale_bitmap(bmp1,GetSystemMetrics(1)*1.5,GetSystemMetrics(1))
bitmap1 = wx.StaticBitmap(frame1, -1, bmp1, (-100, 0))
hwnd = frame1.GetHandle()
extendedStyleSettings = win32gui.GetWindowLong(hwnd, win32con.GWL_EXSTYLE)
win32gui.SetWindowLong(hwnd, win32con.GWL_EXSTYLE, extendedStyleSettings | win32con.WS_EX_LAYERED | win32con.WS_EX_TRANSPARENT)
win32gui.SetLayeredWindowAttributes(hwnd, 0, 255, win32con.LWA_ALPHA)
frame1.SetTransparent(trans)
def onKeyDown(e):
global trans
key = e.GetKeyCode()
if key==wx.WXK_UP:
print trans
trans+=10
if trans >255:
trans = 255
elif key==wx.WXK_DOWN:
print trans
trans-=10
if trans < 0:
trans = 0
try:
win32gui.SetLayeredWindowAttributes(hwnd, 0, trans, win32con.LWA_ALPHA)
except:
pass
frame1.Bind(wx.EVT_KEY_DOWN, onKeyDown)
app.MainLoop()
您可以使用箭头键动态更改透明度 Up/Down。
请注意,window 框架是使用 'wx' 创建的,但也应该与 tkinter 一起使用。
请随意使用代码。
我目前正在使用 python 通过发送鼠标和击键命令来控制游戏。我想要做的是让一个透明的 Tkinter window 位于游戏之上以提供一些信息,例如鼠标位置和像素颜色。
我熟悉更改 window 的 alpha 属性以使其透明,但不知道如何始终将 window 保持在前面并让鼠标点击通过它。
我目前控制游戏的方法包括在某些位置截屏并分析颜色内容。我还需要一些方法在没有 Tkinter window 干扰的情况下做到这一点。
Pysscreenshot用于截图 win32api用于点击
谢谢, 亚历克
您可以使用win32gui
模块的SetWindowLong
功能。如果你想通过 window 进行透明点击,你必须在我们的 window 上应用 GWL_EXSTYLE
。因此,您需要 Window.
hwnd = win32gui.FindWindow(None, "Your window title") # Getting window handle
# hwnd = root.winfo_id() getting hwnd with Tkinter windows
# hwnd = root.GetHandle() getting hwnd with wx windows
lExStyle = win32gui.GetWindowLong(hwnd, win32con.GWL_EXSTYLE)
lExStyle |= win32con.WS_EX_TRANSPARENT | win32con.WS_EX_LAYERED
win32gui.SetWindowLong(hwnd, win32con.GWL_EXSTYLE , lExStyle )
如果您想通过 winapi 更改 window 的透明度,请使用 SetLayeredWindowAttributes
。
编辑:始终在顶部透明的叠加层示例代码 window,它通过点击传递。它获取当前桌面图像并创建透明叠加层,因此您可以享受桌面背景图像。
from win32api import GetSystemMetrics
import win32con
import win32gui
import wx
def scale_bitmap(bitmap, width, height):
image = wx.ImageFromBitmap(bitmap)
image = image.Scale(width, height, wx.IMAGE_QUALITY_HIGH)
result = wx.BitmapFromImage(image)
return result
app = wx.App()
trans = 50
# create a window/frame, no parent, -1 is default ID
# change the size of the frame to fit the backgound images
frame1 = wx.Frame(None, -1, "KEA", style=wx.CLIP_CHILDREN | wx.STAY_ON_TOP)
# create the class instance
frame1.ShowFullScreen(True)
image_file = win32gui.SystemParametersInfo(win32con.SPI_GETDESKWALLPAPER,0,0)
bmp1 = wx.Image(image_file, wx.BITMAP_TYPE_ANY).ConvertToBitmap()
bmp1 = scale_bitmap(bmp1,GetSystemMetrics(1)*1.5,GetSystemMetrics(1))
bitmap1 = wx.StaticBitmap(frame1, -1, bmp1, (-100, 0))
hwnd = frame1.GetHandle()
extendedStyleSettings = win32gui.GetWindowLong(hwnd, win32con.GWL_EXSTYLE)
win32gui.SetWindowLong(hwnd, win32con.GWL_EXSTYLE, extendedStyleSettings | win32con.WS_EX_LAYERED | win32con.WS_EX_TRANSPARENT)
win32gui.SetLayeredWindowAttributes(hwnd, 0, 255, win32con.LWA_ALPHA)
frame1.SetTransparent(trans)
def onKeyDown(e):
global trans
key = e.GetKeyCode()
if key==wx.WXK_UP:
print trans
trans+=10
if trans >255:
trans = 255
elif key==wx.WXK_DOWN:
print trans
trans-=10
if trans < 0:
trans = 0
try:
win32gui.SetLayeredWindowAttributes(hwnd, 0, trans, win32con.LWA_ALPHA)
except:
pass
frame1.Bind(wx.EVT_KEY_DOWN, onKeyDown)
app.MainLoop()
您可以使用箭头键动态更改透明度 Up/Down。 请注意,window 框架是使用 'wx' 创建的,但也应该与 tkinter 一起使用。
请随意使用代码。