//Description:
//Create Date: 2020-11-02 07:58:35
//Author: channy
getActiveWindow()不一定获取的是当前活动窗口
复现路径: 打开一个Outlook主窗口->新建邮件弹出邮件子窗口1->再新建邮件弹出邮件子窗口2->来回切换这三个窗口->
用winapi的GetActiveWindow也一样
复现路径:打开一个Outlook主窗口->双击打开已有的草稿箱中的邮件子窗口->关闭该邮件->再次双击打开该邮件->此时activateWindow总是只获取到主窗口,然而子窗口的zorder确实比主窗口小
[System.Runtime.InteropServices.DllImportAttribute("user32.dll")]
public static extern IntPtr GetActiveWindow();
IntPtr handle = GetActiveWindow();
if (this.RibbonId == "Microsoft.Outlook.Mail.Compose")
{
var win = Globals.ThisAddIn.Application.ActiveInspector();
string Name = win.GetType().InvokeMember("Caption", System.Reflection.BindingFlags.GetProperty, null, win, null).ToString();
index = (int)FindWindow("rctrl_renwnd32\0", Name);
}
else if (this.RibbonId == "Microsoft.Outlook.Explorer")
{
var win = Globals.ThisAddIn.Application.ActiveExplorer();
string Name = win.GetType().InvokeMember("Caption", System.Reflection.BindingFlags.GetProperty, null, win, null).ToString();
index = (int)FindWindow("rctrl_renwnd32\0", Name);
}
Inspector有可能内嵌在Explorer中,注意陷阱!
Microsoft.Outlook.Appointment 事件
Microsoft.Outlook.Task 任务
Microsoft.Outlook.Contact 联系人
Microsoft.Outlook.DistributionList 联系人组
Microsoft.Outlook.Mail.Compose 写新邮件、回复邮件、转发邮件
Microsoft.Outlook.Mail.Read 收到的邮件、已发送的邮件
如果用的是designer, Word是所有窗口共用一个ribbon类,只Load一次;Outlook是每个窗口会Load一次ribbon
如果用的是xml,outlook只会Load一次,getCustomUI只有在当前没有同ribbonID类型的时候才会调用
用desinger不支持给inline型(即打开窗口时没有,需要点其它地方触发才会显示的tab)的tab添加按钮,需要用xml
修改过程序集的名称后会出现安装不上的问题,“无法安装此应用程序,因为已安装具有相同标识的应用程序”
VSTOInstaller.exe /Uninstall file:///D:/YoudaoOfficeAddIn/YdOutlookAddIn/YdOutlookAddIn.vsto
C:\Program Files (x86)\Microsoft SDKs\Windows\v10.0A\bin>"NETFX 4.8 Tools\mage.exe" -cc
计算机\HKEY_CURRENT_USER\Software\Classes\Software\Microsoft\Windows\CurrentVersion\Deployment\SideBySide\2.0\StateManager
用自带的ClickOnce总会出现各种各样的问题,改用Advance Installer了。
c#生成的动态库,打包时一定一定要带上。缺少动态库的情况下,插件在别的机器上只会报崩溃,然后被禁用,除此之外没有任何提示。。。
如果调度机器没有问题,但测试机器有问题,那么有很大可能是打包问题,注意依赖库!
System.Configuration可以用于读写配置信息,如果是指定的配置文件sConfigFilePath,当Open时c#会判断是否存在这个文件,然而读写过程中c#会自行在后面添加.config当作文件名。这就意味着,目录下必须有两个文件才不会有Exception。
例如,如果sConfigFilePath=”outlook.config”,那么同时需要有”outlook.config.config”,前一个文件用于判断配置文件是否存在,后一个文件用于读写具体配置信息。。。
Configuration config = ConfigurationManager.OpenExeConfiguration(sConfigFilePath);
if (config.Sections["appSettings"] != null)
{
var keyvalue = config.AppSettings.Settings[key];
if (keyvalue != null)
{
return keyvalue.Value;
}
}
WH_KEYBOARD=2, WH_KEYBOARD_LL=13
然后发现如果用WH_KEYBOARD_LL,目标窗口输入没反应,非目标窗口输入倒是一堆的log。。。如果用WH_KEYBOARD,只按了一次键回调了n多次。。。
原因未知,后续有时间再研究。
Win32API.HookProc keyHookProc;
uint id = Win32API.GetCurrentThreadId();
Win32API.SetWindowsHookEx((bUseLLKeyBoard ? WH_KEYBOARD_LL : WH_KEYBOARD),
keyHookProc, IntPtr.Zero, (bUseLLKeyBoard ? 0 : id));
KeyboardHookStruct keyHookStruct = (KeyboardHookStruct)Marshal.PtrToStructure(lParam, typeof(KeyboardHookStruct));
Keys keyData = (bUseLLKeyBoard ? (Keys)keyHookStruct.VKCode : (Keys)wParam);
x = Selection.Information(wdHorizontalPositionRelativeToPage)
y = Selection.Information(wdVerticalPositionRelativeToPage)
y = Selection.Information(wdVerticalPositionRelativeToPage) does not return the correct value unless you are in Page view. In Normal view, it returns the distance from the top margin.
Always set the view to be Page view, with Magnification set to 100%, before using the Information property to get the cursor position.
ViewSwitch 视图变化,如从邮件视图到任务视图
加载超过1s就有可能被禁