各位大佬,请问C#如何将一个现有软件的进度条映射到winform中progresbar控件作为进度值?

Helloworld3020 2020-08-04 02:42:11
详细需求是将另一个应用软件(ABC)中的进度条同步映射到winform中的进度条上并在软件ABC,目前我通过while循环获得了软件ABC中进度条的百分比数字result,但result暂时只是循环的内部变量,不知道如何将result实时传递给winform的进度条控件实时显示。求各位大佬不吝赐教,指导一下小白。由于是还在入门的小白,最好是有代码可以参考,不然只有思路的话可能听不太懂,谢谢!
问题分解一下如下:
1)如何将result传递到外部函数并实现同步打印出来;
2)如何将result传递给progressbar控件作为进度值显示;


获取result的代码如下。

AutomationElement formABC = null;
AutomationElement root = AutomationElement.RootElement;
int numWait = 0;
do
{
formABC = root.FindFirst(TreeScope.Children, new PropertyCondition(AutomationElement.NameProperty, "ABC));
Thread.Sleep(50);
numWait++;
} while (numWait < 500 && null == formABC);
if (null == formABC)
{
throw new NullReferenceException("Could not find ABC");
}
else
{
AutomationElement formProgramming = formDPS.FindFirst(TreeScope.Descendants, new PropertyCondition(AutomationElement.NameProperty, "Programming1"));
AutomationElement textPercent = formProgramming.FindFirst(TreeScope.Descendants, new PropertyCondition(AutomationElement.AutomationIdProperty, "1031"));
AutomationElement textElapsedTime = formProgramming.FindFirst(TreeScope.Descendants, new PropertyCondition(AutomationElement.AutomationIdProperty, "1032"));
while (!errorFlag && !successFlag)
{
string percent = UIA.TextGet(textPercent);
string time = UIA.TextGet(textElapsedTime);
Console.WriteLine("{0},{1}", percent, time);
int result = Convert.ToInt32(Regex.Replace(percent, @"[^0-9]+", ""));
//Console.WriteLine(result);
Thread.Sleep(1000);
...全文
2204 6 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
Helloworld3020 2020-08-05
  • 打赏
  • 举报
回复
引用 4 楼 datafansbj 的回复:
[quote=引用 2 楼 Helloworld3020 的回复:]补充一下,我尝试把result在外部定义成了private static int result,同时使用parallel.invoke(上述代码对应的方法,新建打印result的方法)以图能将result同步打印出来,但是失败了。运行的时候新建打印result的方法没有执行。
不明白你的意思。能打印出来,那么到底是成功了还是失败了?result 的值正常吗? 到底是能取到进度的值,只是在打印时出错了,还是根本取不到值?这是两个完全不相干的问题。[/quote] 定义成了private static int result后使用invoke无法通过新建的打印result的方法打印出result结果,我感觉是没有取到result的值。
datafansbj 2020-08-05
  • 打赏
  • 举报
回复
单步调式一下这句:
Console.WriteLine("{0},{1}", percent, time);

percent 的值正确吗?如果正确,那么你的取值没有问题。至于打印,说具体点,真的打印到打印机吗?
datafansbj 2020-08-04
  • 打赏
  • 举报
回复
引用 2 楼 Helloworld3020 的回复:
补充一下,我尝试把result在外部定义成了private static int result,同时使用parallel.invoke(上述代码对应的方法,新建打印result的方法)以图能将result同步打印出来,但是失败了。运行的时候新建打印result的方法没有执行。


不明白你的意思。能打印出来,那么到底是成功了还是失败了?result 的值正常吗?
到底是能取到进度的值,只是在打印时出错了,还是根本取不到值?这是两个完全不相干的问题。
八爻老骥 2020-08-04
  • 打赏
  • 举报
回复
跨进程通讯,大概只能用勾子程序了,拦截A程序的进度条消息,再显示到B程序上。
Helloworld3020 2020-08-04
  • 打赏
  • 举报
回复
补充一下,我尝试把result在外部定义成了private static int result,同时使用parallel.invoke(上述代码对应的方法,新建打印result的方法)以图能将result同步打印出来,但是失败了。运行的时候新建打印result的方法没有执行。
datafansbj 2020-08-04
  • 打赏
  • 举报
回复
既然得到了进度值,把它赋值给其他进度条组件就行了:Processbar1.Value = result。
如果涉及跨线程调用,记得使用 invoke。

111,097

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧