计算新的ScrollPercent - 在ViewSize更改后

时间:2017-08-07 09:14:23

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

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

仅供参考,MS-Word很可能与解决我的问题无关,我基本上只是提到它,所以你知道我所处的背景,但我相信它对于那些不了解MS的人也应该是可以解决的。字。

我遇到的问题是Word的属性VerticalPercentScrolledinteger

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

我已经离开并在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
  3. 我也可以自己查找滚动条并阅读以下值:

    1. RangeValuePattern.LargeChangeProperty
    2. RangeValuePattern.MaximumProperty
    3. RangeValuePattern.MinimumProperty
    4. RangeValuePattern.SmallChangeProperty
    5. RangeValuePattern.ValueProperty
    6. 要查找滚动条,我使用以下代码:

      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
      

      将其更改为所需的百分比值后,scrollBarValue是唯一更新的值,而不是

      scrollBarValue      1054
      

1 个答案:

答案 0 :(得分:1)

因此,您的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)