问题描述
切入正题,我尝试使用 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)的更多信息:
- Customizing the 2007 Office Fluent Ribbon for Developers (Part 1 of 3)
- Customizing the 2007 Office Fluent Ribbon for Developers (Part 2 of 3)
- Customizing the 2007 Office Fluent Ribbon for Developers (Part 3 of 3)
自定义 Office UI 的推荐方法是使用 Fluent UI。命令栏保持原位以实现向后兼容性,例如以编程方式执行按钮等。您现在不应依赖命令栏来创建自定义 UI。