将控制台代码转换成表单应用程序?

萨米

新成员
已加入
2020年9月6日
留言内容
4
编程经验
Beginner
您好,我在找一个代码可以获取所有打开的窗口的名称,并得到以下代码:
C#:
using System.Diagnostics;

Process[] processlist = Process.GetProcesses();

foreach (Process process in processlist)
{
    if (!String.IsNullOrEmpty(process.MainWindowTitle))
    {
        Console.WriteLine("Process: {0} ID: {1} Window title: {2}", process.ProcessName, process.Id, process.MainWindowTitle);
    }
}
该代码可以正常工作,但是我需要在窗体中显示控制台的结果,请问是否可以在c#Windows窗体应用程序中的按钮下将代码添加或转换为代码。
 
Last edited:

金西尼

C#论坛主持人
工作人员
已加入
2011年4月23日
留言内容
3,501
地点
悉尼,澳大利亚
编程经验
10+
您基本上是在问我们如何在Windows Forms应用程序中显示文本。我很难相信您正在寻找有关如何执行此操作的信息,但没有找到任何信息。有多种方法可以将多个字符串组合成一个字符串并显示它们,因此,经过一些研究,应该至少找到一个选择,即使不是多个选择。我建议您进行一些研究,尝试实施一些措施,然后回发并向我们展示如果无效则您做了什么。许多选项之一将涉及StringBuilder,因此也许您应该调查一下。
 

跳伞

工作人员
已加入
2019年4月6日
留言内容
2,500
地点
弗吉尼亚州切萨皮克
编程经验
10+
另外,如果您还处于学习的开始阶段,则倾向于学习会产生长期影响的东西。 WinForms即将寿终正寝。选择最新的WPF,Xamarin或UWP,并将其概念和方法扩展到其他框架。
 

萨米

新成员
已加入
2020年9月6日
留言内容
4
编程经验
Beginner
有多种方法可以将多个字符串组合为一个并显示它们
谢谢,昨天我尝试了很多事情,但我没有找到正确的路线,但您的提示触及了头。

WinForms生命将尽
当某人以为他发现了它已经转移到另一个地方时,技术就像海市to楼。

编辑后的代码:

C#:
private void Btn1_Click(object sender, EventArgs e)
        {
            Process[] processlist = Process.GetProcesses();
            System.Text.StringBuilder sb = new System.Text.StringBuilder();
            foreach (Process process in processlist)
            {
                if (!String.IsNullOrEmpty(process.MainWindowTitle))
                {             
                    sb.Append(("Process: {0} ID: {1} Window title: {2}", process.ProcessName, process.Id, process.MainWindowTitle));
         
                    Rtxt1.Text = sb.ToString();
                }
            }
        }
 
Last edited:

金西尼

C#论坛主持人
工作人员
已加入
2011年4月23日
留言内容
3,501
地点
悉尼,澳大利亚
编程经验
10+
我应用了您的提示,但是在编辑前后一切正常,一切都没有改变。
确实发生了某些变化,但是您看不到它,因为它发生得太快了。使用所拥有的代码,每次向其添加一行时,您都将显示当前文本。这毫无意义,因为您只需要在添加所有部分之后的最终文本即可。通过移动该行,您不会在显示最终文本之前一遍又一遍地显示不完整的文本;您只需在准备好后显示最终文本。您的原始代码产生了所需的结果,但是它以次优的方式完成了。这就是为什么您需要对代码需要做什么有一个清晰的了解,即要实现一个算法。如果这样做,那么您将永远不会再有算法重复显示部分文本。您只需在末尾显示一次,这就是您的代码应该执行的操作。
 
Last edited:

羊皮

退休程序员
工作人员
已加入
2018年9月5日
留言内容
1,925
地点
英国
编程经验
10+
您确实不应该那样更新您的UI。

  • 转到WPF,并跳过Winforms,因为Winforms是EOL。您应该使用WPF或Xamarin。
  • 您应该使用模型来控制和更新UI。
  • 缺少模型将意味着您当前正在错误地更新UI。无论您的操作多么小,都不应在用户界面的按钮或其他控件中运行操作。这就是为什么我们使用视图和模型。
  • 通过不使用模型,您需要其他方法来更新UI。对于那些不喜欢看风景的人;他们通常更喜欢使用线程和任务。没关系,但不建议这样做。视图和模型。
然而;如果您只想更新UI,而不是在查找所有打开的进程(如果它们的加载打开时将其挂起)时挂起它,则可以使用此示例代码,了解如何使用线程和任务在更新UI的同时执行冗长的操作。虽然这也可以按照您的意愿进行,并且效率更高。还有很多改进的余地,例如在任务中添加using块,但是,您也应该谨慎行事,因为using块可能还会尝试处理尚未完成运行的任务,并且这将导致引发异常。您可以在此处进行很多修改,但是如果您真的对使用此方法而不是WPF和整个视图和模型方法感兴趣,请尝试搜索线程,多线程等关键字,并按我的用户名进行搜索。之前,我已经多次回答这些问题,并且过去提供了很多示例。

这是代码:
C#:
        internal static 清单<Process> processlist = new 清单<Process>();
        internal delegate void Delegate_Callback_To(string itm_Value, Control control, bool visibility);
        public void UpdateUI_With_NewItem(string value, Control control, bool visibility)
        {
            control.Text = value;
            control.Visible = visibility;
        }
        public Form1()
        {
            InitializeComponent();
        }
        private void button1_Click(object sender, EventArgs e)
        {
            Task Task_UpdateLabel = new Task(() => UpdateLabel("Please wait while we search for open programs", label1, true));
            Task_UpdateLabel.Start();

            Task FindProcess = new Task(() => GetProcesses());
            FindProcess.Start();
        }
        internal void UpdateLabel(string ui_Message, Control control, bool visible) => Rtxt1.Invoke(new Delegate_Callback_To(UpdateUI_With_NewItem), ui_Message, control, visible);
        internal 清单<Process> GetProcesses()
        {
            processlist.AddRange(Process.GetProcesses().Where(process => !string.IsNullOrEmpty(process.MainWindowTitle)));
            Task WithProcessList = new Task(() => WithProcesses(processlist));
            WithProcessList.Start();
            WithProcessList.Wait();
            return processlist;
        }
        internal void WithProcesses(List<Process> processes)
        {
            StringBuilder builder = new StringBuilder();
            processes.ForEach((Process current_Process) => builder.AppendLine($"Process: {current_Process.ProcessName} ID: {current_Process.Id} Window title: {current_Process.MainWindowTitle}"));
            Rtxt1.Invoke(new Delegate_Callback_To(UpdateUI_With_NewItem), builder.ToString(), Rtxt1, true);
            label1.Invoke(new Delegate_Callback_To(UpdateUI_With_NewItem), "", label1, false);
        }

实际操作中的一些示例屏幕截图。我还添加了label1以在任务运行时向用户显示一条消息,一旦完成,建议设置标签。随时进行改进,并在此处共享。

开始: 屏幕截图
结尾 : 屏幕截图
 

羊皮

退休程序员
工作人员
已加入
2018年9月5日
留言内容
1,925
地点
英国
编程经验
10+
刚刚更新了上面代码中的一个小错字。复制粘贴-旧习惯很难解决。
 
最佳 底部