如何获取Microsoft.Office.Interop.Word.Range的屏幕坐标并用于定位外部窗体
如何获取Microsoft.Office.Interop.Word.Range的屏幕坐标并用于定位外部窗体
嗨,这个问题我之前帮人处理过,其实Word的Range对象本身没直接提供屏幕坐标的属性,但咱们可以通过它的Information属性配合Word自带的转换方法轻松搞定,步骤很清晰:
首先,咱们得先拿到Range相对于Word窗口客户区的位置(Word默认用磅作为度量单位),然后用Word窗口的内置方法把磅值转成屏幕像素坐标,这样就能直接用在WinForms窗体的Location属性上了。
给你调整后的完整代码示例:
using Microsoft.Office.Interop.Word; using System.Drawing; // 你已有的Range对象 Range targetRange = window.Selection.Range; // 获取Range左上角相对于Word窗口客户区的位置(单位:磅) float rangeRelativeLeft = (float)targetRange.Information[WdInformation.wdHorizontalPositionRelativeToWindow]; float rangeRelativeTop = (float)targetRange.Information[WdInformation.wdVerticalPositionRelativeToWindow]; // 调用Word的内置方法,把磅值转成屏幕像素坐标 int screenLeft = window.Application.ActiveWindow.PointsToScreenPixelsX(rangeRelativeLeft); int screenTop = window.Application.ActiveWindow.PointsToScreenPixelsY(rangeRelativeTop); // 定位你的timeForm窗体 timeForm.Location = new Point(screenLeft, screenTop);
这里还有几个要注意的小细节:
- 如果你想把窗体定位到Range的右下角或者其他位置,只需要加上Range的宽度和高度就行——宽度用
targetRange.Width,高度用targetRange.Height,同样转成像素后叠加到坐标上就好。 - 一定要确保Word窗口不是最小化状态,不然获取到的坐标会出现异常。
- 这个方法会自动适配不同屏幕的DPI缩放,比自己手动转磅到像素靠谱多了,因为Word已经帮咱们处理了DPI的兼容问题。
要是你用的是特别老的Word版本(比如2007及更早),PointsToScreenPixelsX/Y这个方法可能不存在,那就得手动转:先获取屏幕的DPI,然后用像素 = 磅值 * DPI / 72计算,再加上Word窗口在屏幕上的位置(window.Left和window.Top,注意这两个值是屏幕坐标的磅值,也要转成像素)。不过现在大部分环境都是Word 2010及以后的版本了,用内置方法肯定更省心。
备注:内容来源于stack exchange,提问作者user30292512
相关产品推荐
相关产品推荐

