Search code examples
pythonwxpython

detect a ctrl-click on taskbar menu


The code below is a simplified version of my task bar icon class, I haven't checked the GetKeyCode() value to see if it's a ctrl as the key press events aren't being fired. Should I be binding key presses to somewhere else?

class TBI(wx.TaskBarIcon):
    TBMENU_CTRLCLICK= wx.NewId()

    def __init__(self,frame):
        wx.TaskBarIcon.__init__(self)
        self.frame=frame
        self.ctrl_down=False

        self.Bind(wx.EVT_KEY_DOWN, self.OnKeyDown)
        self.Bind(wx.EVT_KEY_UP, self.OnKeyUp)
        self.Bind(wx.EVT_MENU, self.OnCtrlClick, id=self.TBMENU_CTRLCLICK)

    def CreatePopupMenu(self):
        menu= wx.Menu()
        if self.ctrl_down:
            menu.Append(self.TBMENU_CTRLCLICK, "Ctrl Click")
            menu.AppendSeparator()
        menu.Append(wx.ID_EXIT, "Exit")
        return menu

    def OnKeyDown(self,event):
        self.ctrl_down=True
        event.Skip()

    def OnKeyUp(self,event):
        self.ctrl_down=False
        event.Skip()

Solution

  • Use wx.GetKeyState as so:

    import wx
    
    class TBI(wx.TaskBarIcon):
        def __init__(self):
            wx.TaskBarIcon.__init__(self)
            icon = wx.ArtProvider.GetIcon(wx.ART_FILE_OPEN, wx.ART_TOOLBAR)
            self.SetIcon(icon, "Icon")
            self.Bind(wx.EVT_TASKBAR_RIGHT_UP, self.on_right_up)
    
        def on_right_up(self, event):
             if wx.GetKeyState(wx.WXK_CONTROL):
                 print 'ctrl was pressed!'
    
    
    app = wx.App(redirect=False)
    icon = TBI()
    app.MainLoop()
    

    Right click the taskbar icon and then try with ctrl held down to see it in action.