VSTO Outlook插件中Screen.FromControl致预览窗格空白问题求助
问题原因及解决思路
核心原因
你在myHostControl构造函数里调用System.Windows.Forms.Screen.FromControl(this).Bounds的时机不对——WinForms控件构造函数执行时,控件还没被添加到Outlook的自定义任务窗格(CTP)容器中,也没有生成有效的窗口句柄(HWND)。
Screen.FromControl方法需要依赖控件的有效句柄来关联屏幕上下文,这时候强制调用会触发控件提前创建句柄,但此时控件还未完成与Outlook Explorer窗口的布局绑定,会打乱Outlook内部的界面布局逻辑和消息循环,进而影响到Explorer窗口里预览区域的渲染(毕竟CTP和预览区域同属Explorer的布局上下文)。而检查器窗口是独立的弹窗,不受Explorer布局异常的影响,所以双击打开邮件能正常显示。
解决办法
把获取屏幕边界的代码移到控件的Load事件或者HandleCreated事件中执行,这时候控件已经完成在CTP中的加载,句柄有效且关联了正确的窗口上下文,不会干扰Outlook的布局逻辑:
// 在myHostControl的Load事件中执行 private void myHostControl_Load(object sender, EventArgs e) { var screenBounds = System.Windows.Forms.Screen.FromControl(this).Bounds; // 后续逻辑 }
内容的提问来源于stack exchange,提问作者Willy
相关产品推荐
相关产品推荐

