c# - 计算新的 ScrollPercent - 在 ViewSize 改变之后

标签 c# ms-word ui-automation white-framework

首先,基本上我认为我只需要帮助弄清楚如何计算它,数学并不是我的强项。

仅供引用,MS-Word 很可能与解决我的问题无关,我基本上只是提到它所以你知道我所处的环境,但我相信对于不了解 MS 的人来说它也应该是可以解决的-词。

我的问题是 Word 的属性 VerticalPercentScrolled 是一个 integer

这并不像我需要的那样准确,考虑一个 300 页的 Word 文档,滚动条只能有一个介于 0 - 100(百分比)之间的 integer,例如 25% 300 页的文档是一个相当大的范围。

UI Automation 库 - TestStack.White - 的帮助下,我现在已经读取了正确的值,并且可以成功地将它设置为它的旧值,如果发生一些不需要的滚动。

像这样:

var hWnd = (IntPtr)WordUtils.GetHwnd();
var processId = Process.GetCurrentProcess().Id;

var uiApp = TestStack.White.Application.Attach((int)processId);
var uiWindow = uiApp.GetWindow(WindowHandling.GetWindowText(hWnd), InitializeOption.NoCache);

var wf = (IUIItemContainer)uiWindow.Get(SearchCriteria.ByClassName("_WwF"));
var wbs= wf.GetMultiple(SearchCriteria.ByClassName("_WwB"));
if (wbs.Length != 1)
    return;

var wb= (IUIItemContainer)wbs.First();
var wgs = wb.GetMultiple(SearchCriteria.ByClassName("_WwG"));
if (wgs.Length != 1)
    return;

var wg = wgs.First();
var element = wg.AutomationElement;

var oldVerticalPercent = (double)element.GetCurrentPropertyValue(ScrollPattern.VerticalScrollPercentProperty);

使用这段代码我得到一个百分比值让我们说 9.442248572683356 而不是 9

要重置我使用以下代码的值:

object scrollPattern;
if (element.TryGetCurrentPattern(ScrollPattern.Pattern, out scrollPattern))
    ((ScrollPattern)scrollPattern).SetScrollPercent(ScrollPattern.NoScroll, oldVerticalPercent);

这就像一个魅力。

现在我的问题是,如果我的文档在存储 oldValue 期间变大/变小并想重新应用它,我的 oldValue 需要调整。

我可以读取以下值(至少我目前找到的值):

  1. ScrollPattern.VerticalScrollPercentProperty
  2. ScrollPattern.VerticalViewSizeProperty

我也可以去寻找它自己的滚动条并读取以下值:

  1. RangeValuePattern.LargeChangeProperty
  2. RangeValuePattern.MaximumProperty
  3. RangeValuePattern.MinimumProperty
  4. RangeValuePattern.SmallChangeProperty
  5. RangeValuePattern.ValueProperty

要查找滚动条,我使用以下代码:

var hWnd = (IntPtr)WordUtils.GetHwnd();
var processId = Process.GetCurrentProcess().Id;

var uiApp = Ts.Application.Attach((int)processId);
var uiWindow = uiApp.GetWindow(WindowHandling.GetWindowText(hWnd), InitializeOption.NoCache);

var wf = (IUIItemContainer)uiWindow.Get(SearchCriteria.ByClassName("_WwF"));
var wbs = wf.GetMultiple(SearchCriteria.ByClassName("_WwB"));
if (wbs.Length != 1)
    return;

var wb = (IUIItemContainer)wbs.First();
var wgs= wb.GetMultiple(SearchCriteria.ByClassName("_WwG"));
if (wgs.Length != 1)
    return;

var nUiScrollBars = wgs.GetMultiple(SearchCriteria.ByClassName("NUIScrollbar"));
if (scrollBar.Length != 1)
    return;

var nUiScrollBar = (IUIItemContainer)nUiScrollBars.First();
var nUiHwndElements = nUiScrollBar.GetMultiple(SearchCriteria.ByClassName("NetUIHWNDElement"));
if (nUiHwndElements.Length != 1)
    return;

var nUiHwndElement = (IUIItemContainer)nUiHwndElements.First();
var netUiScrollBar = nUiHwndElement.GetElement(SearchCriteria.ByClassName("NetUIScrollBar"));

var scrollBarValue = (double)netUiScrollBar.GetCurrentPropertyValue(RangeValuePattern.ValueProperty);

您可能会问自己,为什么我在可以访问 RangeValuePattern.ValueProperty 时不设置它,问题是当我更改此属性时 Word 不会更新文档,滚动拇指会移动,但文档不会移动一英寸。

我必须设置 ScrollPattern.VerticalScrollPercentProperty 才能正常工作。

所以我的问题是,如何根据 oldValue 计算新的 ScrollPattern.VerticalScrollPercentProperty,文档可以在其中缩小或增大大小?

编辑:

这是一个测试场景:

scrollPercent       64.86486486486487
scrollViewSize      74.394463667820062
scrollBarLargeChange    37197
scrollBarMaximum        12803
scrollBarMinimum        0
scrollBarSmallChange    1
scrollBarValue      8304

插入5个新页面后

scrollPercent       87.890366182251867 <-- undesired scrolling occured (see desired values below)
scrollViewSize      9.442248572683356
scrollBarLargeChange    4721
scrollBarMaximum        45279
scrollBarMinimum        0
scrollBarSmallChange    1
scrollBarValue      39795 <-- undesired scrolling occured (see desired values below)

如前所述,我需要调整 scrollPercent - 在插入这些页面后 - 以便它再次位于旧位置。

我可以告诉你,在这个测试场景中,我需要新的值是

scrollPercent       2.3278413357480452

将其更改为所需的 percentValue 后,scrollBarValue 是唯一更新的值,它比

scrollBarValue      1054

最佳答案

所以,看起来您的 scrollPercent 是这样计算的:

scrollPercent = 100.0 * scrollBarValue / (scrollBarMaximum - 1);

所以数学应该这样计算(假设浮点除法):

scrollPercentOld = 100.0 * scrollBarValueOld / (scrollBarMaximumOld - 1)
scrollPercentNew = 100.0 * scrollBarValueOld / (scrollBarMaximumNew - 1)

据此,您有:

scrollBarValueOld = scrollPercentOld * (scrollBarMaximumOld - 1) / 100.0
scrollBarValueOld = scrollPercentNew * (scrollBarMaximumNew - 1) / 100.0

当你将两者等同时,你会得到:

scrollPercentOld * (scrollBarMaximumOld - 1) = scrollPercentNew * (scrollBarMaximumNew - 1)

然后最后:

scrollPercentNew = scrollPercentOld * (scrollBarMaximumOld - 1) / (scrollBarMaximumNew - 1)

关于c# - 计算新的 ScrollPercent - 在 ViewSize 改变之后,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45543328/

相关文章:

c# - Entity Framework 核心,更新数据库不考虑属性

ms-word - 如何提供 .RTF

vba - 在Word中查找文本并在其后插入数据

xml - 在 Word 2010 中开发功能区选项卡,在组标签名称中使用 & 符号

automation - 我可以从哪里下载 Windows 自动化 API?

c# - 白色 UIAutomation click() 停止在不同平台上工作

c# - 试图在c#中获取链表的特定节点的地址

c# - 在 Nest Elastic Search 中按降序获取 Distinct Term

c# - Automapper - AssertConfigurationIsValid 调用失败但映射仍然有效

使用 Selendroid 在 Android Studio 中进行测试