У меня были проблемы с форматированием заголовка этого вопроса, потому что я не был уверен, что поступлю правильно, поэтому позвольте мне объяснить.
Я хочу попытаться добавить контекстное меню, вызываемое правой кнопкой мыши, в существующую программу, для которой у меня нет исходного кода.wxPython, как правило, мой выбор.Я подумал, что есть несколько способов сделать это:
1) Создайте прозрачный wx.Frame, который привязан к существующей программе и сидит над ней, перехватывая события мыши.Если бы я сделал это, я не был уверен, можно ли передать события мыши в основное окно.Мне нравится эта опция, потому что она позволит добавлять больше полезной информации в оверлей.
2) Создайте безголовую программу, которая глобально перехватывает события щелчка правой кнопкой мыши и порождает контекстное меню в месте указателя при выполнении определенных условий.Основываясь на исследовании, которое я провел до сих пор, это не представляется возможным без постоянного опроса положения мыши.
Чего мне не хватает?Есть ли более элегантное решение для этого?Возможно ли это даже с помощью Python?
edit: у меня есть частичная проверка концепции, которая выглядит следующим образом:
import wx
import win32gui
import win32api
import win32con
class POC_Frame(wx.Frame):
def __init__(self, parent):
wx.Frame.__init__(self, parent, id=wx.ID_ANY, title='POC', pos=(0,0), size=wx.Size(500, 500), style=wx.DEFAULT_FRAME_STYLE)
self.ToggleWindowStyle(wx.STAY_ON_TOP)
extendedStyleSettings = win32gui.GetWindowLong(self.GetHandle(), win32con.GWL_EXSTYLE)
win32gui.SetWindowLong(self.GetHandle(), win32con.GWL_EXSTYLE,
extendedStyleSettings | win32con.WS_EX_LAYERED | win32con.WS_EX_TRANSPARENT)
win32gui.SetLayeredWindowAttributes(self.GetHandle(), win32api.RGB(0,0,0), 100, win32con.LWA_ALPHA)
self.Bind(wx.EVT_RIGHT_DOWN, self.onRightDown)
self.Bind(wx.EVT_RIGHT_UP, self.onRightUp)
self.CaptureMouse()
def onRightDown(self, event):
print(event)
def onRightUp(self, event):
print(event)
app = wx.App(False)
MainFrame = POC_Frame(None)
MainFrame.Show()
app.MainLoop()
Это, кажется, работает нормально, так как оно проходит правильнощелкните события в нижележащем окне, все еще распознавая их, но он делает это только один раз.Как только он теряет фокус, он перестает работать, и ничто из того, что я пытался вернуть, кажется, не работает.