Python win32com 演示 outlookaddin.py 控制按钮 标题不起作用

问题描述

切入正题,我尝试使用 Python win32com 演示版 outlookAddin.py,它在 Outlook 2010 中运行良好。

升级到 Outlook 2016,从那时起,outlookAddin.py 仍在工作,但它在加载项功能区中添加的加载项 msoControlButton 没有标题

任何人都可以帮助我了解如何解决此问题。认情况下,任何安装了 win32com 的人都可以使用该代码,但我仍然在下面提供它以供参考。

from win32com import universal
from win32com.server.exception import COMException
from win32com.client import gencache,dispatchWithEvents
import winerror
import pythoncom
from win32com.client import constants
import sys

# Support for COM objects we use.
gencache.EnsureModule('{00062FFF-0000-0000-C000-000000000046}',9,bForDemand=True) # Outlook 9
gencache.EnsureModule('{2DF8D04C-5BFA-101B-BDE5-00AA0044DE52}',2,1,bForDemand=True) # Office 9

# The TLB defining the interfaces we implement
universal.RegisterInterfaces('{AC0714F2-3D04-11D1-AE7D-00A0C90F26F4}',["_IDTExtensibility2"])

class ButtonEvent:
    def OnClick(self,button,cancel):
        import win32ui # Possible,but not necessary,to use a Pythonwin GUI
        win32ui.MessageBox("Hello from Python")
        return cancel

class FolderEvent:
    def OnItemAdd(self,item):
        try:
            print("An item was added to the inBox with subject:",item.Subject)
        except AttributeError:
            print("An item was added to the inBox,but it has no subject! - ",repr(item))



class OutlookAddin:
    _com_interfaces_ = ['_IDTExtensibility2']
    _public_methods_ = []
    _reg_clsctx_ = pythoncom.CLSCTX_INPROC_SERVER
    _reg_clsid_ = "{0F47D9F3-598B-4d24-B7E3-92AC15ED27E2}"
    _reg_progid_ = "Python.Test.OutlookAddin"
    _reg_policy_spec_ = "win32com.server.policy.EventHandlerPolicy"
    def OnConnection(self,application,connectMode,addin,custom):
        print("OnConnection",custom)
        # ActiveExplorer may be none when started without a UI (eg,WinCE synchronisation)
        activeExplorer = application.ActiveExplorer()
        if activeExplorer is not None:
            bars = activeExplorer.CommandBars
            toolbar = bars.Item("Standard")
            item = toolbar.Controls.Add(Type=constants.msoControlButton,Temporary=True)
            # Hook events for the item
            item = self.toolbarButton = dispatchWithEvents(item,ButtonEvent)
            item.Caption = "Python"
            item.TooltipText = "Click for Python"
            item.Enabled = True


        # And Now,for the sake of demonstration,setup a hook for all new messages
        inBox = application.Session.GetDefaultFolder(constants.olFolderInBox)
        self.inBoxItems = dispatchWithEvents(inBox.Items,FolderEvent)

    def Ondisconnection(self,mode,custom):
        print("Ondisconnection")
    def OnAddInsUpdate(self,custom):
        print("OnAddInsUpdate",custom)
    def OnStartupComplete(self,custom):
        print("OnStartupComplete",custom)
    def OnBeginShutdown(self,custom):
        print("OnBeginShutdown",custom)

def Registeraddin(klass):
    import winreg
    key = winreg.CreateKey(winreg.HKEY_CURRENT_USER,"Software\\Microsoft\\Office\\Outlook\\Addins")
    subkey = winreg.CreateKey(key,klass._reg_progid_)
    winreg.SetValueEx(subkey,"CommandLinesafe",winreg.REG_DWORD,0)
    winreg.SetValueEx(subkey,"LoadBehavior",3)
    winreg.SetValueEx(subkey,"Description",winreg.REG_SZ,"FriendlyName",klass._reg_progid_)

def Unregisteraddin(klass):
    import winreg
    try:
        winreg.DeleteKey(winreg.HKEY_CURRENT_USER,"Software\\Microsoft\\Office\\Outlook\\Addins\\" + klass._reg_progid_)
    except WindowsError:
        pass

if __name__ == '__main__':
    import win32com.server.register
    win32com.server.register.UseCommandLine(OutlookAddin)
    if "--unregister" in sys.argv:
        Unregisteraddin(OutlookAddin)
    else:
        Registeraddin(OutlookAddin)

解决方法

CommandBars 已弃用。 Office 2010 是第一个不将命令栏用于 UI 的版本。您可以在以下系列文章中阅读有关 Fluent UI(又名 Ribbon UI)的更多信息:

自定义 Office UI 的推荐方法是使用 Fluent UI。命令栏保持原位以实现向后兼容性,例如以编程方式执行按钮等。您现在不应依赖命令栏来创建自定义 UI。