簡體   English   中英

最小化窗口功能僅在調試器(C#-Console)中逐步調試時有效

[英]Minimize Window function only works when stepping through in Debugger (C# - Console)

**編輯:當我在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);
                }
            }
        }
    }
}

如果使用ProcessStartInfo對象,則可以指定正在啟動的進程的WindowStyle:

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

好,我知道了。 我需要在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);
                }
            }
        }
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM