【问题标题】:Minimize Window function only works when stepping through in Debugger (C# - Console)最小化窗口功能仅在调试器中单步执行时有效(C# - 控制台)
【发布时间】:2017-10-08 03:13:23
【问题描述】:

**编辑:当我在 MinimizePlayer() 方法中放置一个断点并逐步执行它时,它会最小化 wmplayer 进程。但它并非没有经过。我不知道为什么。 **

我的 Linux 机器上有一个类似的脚本,我在其中自动化了一些我每次启动时使用的任务。我能够启动 Rhythmbox,开始播放我的播放列表,并最小化这个过程。

好吧,我正在我的新 Windows 10 机器上尝试同样的事情,但我不知道如何从我的脚本中最小化 wmplayer.exe 进程。

这是我目前所拥有的。它工作正常,我只想最小化 wmplayer:

using System;
using System.Diagnostics;
using System.Threading;
using System.Runtime.InteropServices;


namespace Playlist
{
    class Program
    {

        [DllImport("user32.dll")]
        private static extern bool ShowWindow(IntPtr hWnd, WindowShowStyle nCmdShow);

        private enum WindowShowStyle:uint
        {
            Hide = 0,
            ShowMinimized = 2, 
            Minimize = 6
        }

        static void Main(string[] args)
        {
            Run();
        }


        public static void Run()
        {

            String username = Environment.UserName;
            username = char.ToUpper(username[0]) + username.Substring(1);
            Console.WriteLine("Hello " + username);
            Thread.Sleep(2000);
            Console.WriteLine("Opening Playlist...");
            Thread.Sleep(2000);

            Process.Start("wmplayer.exe", "C:\\Users\\" + username + "\\Music\\A_ChillstepMix.mp3");
            //Thread.Sleep(2000);
            //Console.WriteLine("Opening your IDE...");
            //Thread.Sleep(2000);
            //Process.Start("C:\\Program Files (x86)\\Microsoft Visual Studio\\2017\\Community\\Common7\\IDE\\devenv.exe");
            //Thread.Sleep(2000);
            MinimizePlayer();
            Thread.Sleep(2000);
            Console.WriteLine("Goodbye...");
            Thread.Sleep(2000);                
            System.Environment.Exit(0);   

        }       
        public static void MinimizePlayer()
        {
            Process[] ps = Process.GetProcesses();
            foreach(Process p in ps)
            {
                if(p.ProcessName.Contains("wmplayer"))
                {
                    IntPtr h = p.MainWindowHandle;

                    ShowWindow(h, WindowShowStyle.Minimize);
                }
            }
        }
    }
}

【问题讨论】:

  • 你的意思是如何最小化进程的窗口大小?如果是这样,您可以尝试检查thisthis
  • 抱歉,我不认为?我只想在 Windows Media Player 启动时最小化它。第二个例子是使用 WinForms。我正在控制台应用程序中执行此操作。
  • 看看第二个链接上的答案,您可以在其中使用 Win32API 函数,SetWindowPosShowWindow。控制台应用程序或 Winform 无关紧要

标签: c# automation console-application


【解决方案1】:

如果使用 ProcessStartInfo 对象,您可以指定正在启动的进程的 WindowStyle:

var psi = new System.Diagnostics.ProcessStartInfo();
psi.WindowStyle = System.Diagnostics.ProcessWindowStyle.Minimized;
psi.FileName = "wmplayer.exe";
System.Diagnostics.Process.Start(psi);

【讨论】:

  • 我已经编辑了我的问题和代码以显示更改。它仅在我使用调试器单步执行时才有效。我不知道为什么。
【解决方案2】:

好的,我明白了。我需要在 MinimizePlayer() 方法之前添加 Thread.Sleep() 。工作代码如下(我在调试时注释掉了Visual Studio的东西以加快速度):

using System;
using System.Diagnostics;
using System.Threading;
using System.Runtime.InteropServices;


namespace Playlist
{
    class Program
    {

        [DllImport("user32.dll")]
        private static extern bool ShowWindow(IntPtr hWnd, WindowShowStyle nCmdShow);

        private enum WindowShowStyle:uint
        {
            Hide = 0,
            ShowMinimized = 2, 
            Minimize = 6
        }

        static void Main(string[] args)
        {
            Run();
        }


        public static void Run()
        {

            String username = Environment.UserName;
            username = char.ToUpper(username[0]) + username.Substring(1);
            Console.WriteLine("Hello " + username);
            Thread.Sleep(2000);
            Console.WriteLine("Opening Playlist...");
            Thread.Sleep(2000);

            Process.Start("wmplayer.exe", "C:\\Users\\" + username + "\\Music\\A_ChillstepMix.mp3");
            //Thread.Sleep(2000);
            //Console.WriteLine("Opening your IDE...");
            //Thread.Sleep(2000);
            //Process.Start("C:\\Program Files (x86)\\Microsoft Visual Studio\\2017\\Community\\Common7\\IDE\\devenv.exe");
            Thread.Sleep(2000);
            Console.WriteLine("Minimizing Player...");
            Thread.Sleep(2000);
            MinimizePlayer();
            Thread.Sleep(2000);
            Console.WriteLine("Goodbye...");
            Thread.Sleep(5000);            
            System.Environment.Exit(0);   

        }       
        public static void MinimizePlayer()
        {
            Process[] ps = Process.GetProcesses();
            foreach(Process p in ps)
            {
                if(p.ProcessName.Contains("wmplayer"))
                {
                    IntPtr h = p.MainWindowHandle;

                    ShowWindow(h, WindowShowStyle.Minimize);
                }
            }
        }
    }
}

【讨论】:

    猜你喜欢
    • 2014-03-29
    • 2014-06-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多