c#单一程序运行续-最小化后显示

来源:互联网 发布:wps表格怎么筛选数据 编辑:程序博客网 时间:2024/06/01 18:34

程序最小化后,再点击程序,程序最大化。


 static class Program
    {
        [DllImport("user32.dll ", CharSet = CharSet.Unicode)]


        public static extern IntPtr PostMessage(IntPtr hwnd, int wMsg, IntPtr wParam, IntPtr lParam);


        [DllImport("User32.dll ", EntryPoint = "FindWindow")]


        private static extern IntPtr FindWindow(string lpClassName, string lpWindowName);//关键方法


        [DllImport("user32.dll", EntryPoint = "ShowWindow", CharSet = CharSet.Auto)]


        public static extern int ShowWindow(IntPtr hwnd, int nCmdShow);//关键方法
        

        /// <summary>

        /// 应用程序的主入口点。
        /// </summary>
        [STAThread]
        static void Main()
        {
            //Application.EnableVisualStyles();
            //Application.SetCompatibleTextRenderingDefault(false);
            //Application.Run(new Form1());


            //判断之前是否已经打开了相同的进程 
            //new   Bestzone.MIS.Report.F1BookContainer();
            IntPtr handle;
            IntPtr ishandle = new IntPtr(0);


            handle = FindWindow(null, "集中控制系统");
            if (handle == ishandle)
            {
                handle = FindWindow(null, "集中控制系统-车身控制");
            }
            if (handle == ishandle)
            {
                handle = FindWindow(null, "集中控制系统-配电监测");
            }
            if (handle == ishandle)
            {
                handle = FindWindow(null, "集中控制系统-环境监控");
            }
            if (handle == ishandle)
            {
                handle = FindWindow(null, "集中控制系统-视频监测");
            }


            bool alreadyExist = false;
            try
            {
                System.Diagnostics.Process curP = System.Diagnostics.Process.GetCurrentProcess();
                System.Diagnostics.Process[] ps = System.Diagnostics.Process.GetProcesses();
                foreach (System.Diagnostics.Process p in ps)
                {
                    if (p.ProcessName.Equals(curP.ProcessName) && p.Id != curP.Id)
                    {
                        alreadyExist = true;
                    }
                }
            }
            catch (System.PlatformNotSupportedException ex) { ex.ToString(); }
            catch (System.InvalidOperationException ex) { ex.ToString(); }


            //如果已经存在,则放弃本进程 
            if (alreadyExist)
            {
                MessageBox.Show("该程序正在!");
                ShowWindow(handle, 3);
                return;
            }


            Application.Run(new Form1());
        }


//===============================================================

FindWindow()函数的用法。要在C#里使用该API,写出FindWindow()函数的声明: 
            [DllImport("coredll.dll", EntryPoint = "FindWindow")]
            private extern static IntPtr FindWindow(string lpClassName, string lpWindowName);
        这个函数有两个参数,第一个是要找的窗口的类,第二个是要找的窗口的标题。在搜索的时候不一定两者都知道,但至少要知道其中的一个。有的窗口的标题是比较容易得到的,如"计算器",所以搜索时应使用标题进行搜索。但有的软件的标题不是固定的,如"记事本",如果打开的文件不同,窗口标题也不同,这时使用窗口类搜索就比较方便。如果找到了满足条件的窗口,这个函数返回该窗口的句柄,否则返回0。 看例子

           IntPtr ParenthWnd = new IntPtr(0);

            ParenthWnd = FindWindow(null,"Word Mobile");
            //判断这个窗体是否有效 
            if (ParenthWnd != IntPtr.Zero)
            {
                MessageBox.Show("找到窗口");
            }

            else

                MessageBox.Show("没有找到窗口");


注:不知道第一个参数应该怎么用,查了资料也试验过都不好用,谁知道“窗口的类”是什么可以告诉我。学习下。

//===============================================================

[DllImport("user32.dll", EntryPoint = "ShowWindow", CharSet = CharSet.Auto)]

        public static extern int ShowWindow(IntPtr hwnd, int nCmdShow);

函数功能:该函数设置指定窗口的显示状态。

    参数:

    hWnd:窗口句柄。

    nCmdShow:指定窗口如何显示。如果发送应用程序的程序提供了STARTUPINFO结构,则应用程序第一次调用ShowWindow时该参数被忽略。否则,在第一次调用ShowWindow函数时,该值应为在函数WinMain中nCmdShow参数。在随后的调用中,该参数可以为下列值之一:

    SW_FORCEMINIMIZE:在WindowNT5.0中最小化窗口,即使拥有窗口的线程被挂起也会最小化。在从其他线程最小化窗口时才使用这个参数。

    SW_MIOE:隐藏窗口并激活其他窗口。

    SW_MAXIMIZE:最大化指定的窗口。

    SW_MINIMIZE:最小化指定的窗口并且激活在Z序中的下一个顶层窗口。

    SW_RESTORE:激活并显示窗口。如果窗口最小化或最大化,则系统将窗口恢复到原来的尺寸和位置。在恢复最小化窗口时,应用程序应该指定这个标志。

    SW_SHOW:在窗口原来的位置以原来的尺寸激活和显示窗口。

    SW_SHOWDEFAULT:依据在STARTUPINFO结构中指定的SW_FLAG标志设定显示状态,STARTUPINFO 结构是由启动应用程序的程序传递给CreateProcess函数的。

    SW_SHOWMAXIMIZED:激活窗口并将其最大化。

    SW_SHOWMINIMIZED:激活窗口并将其最小化。

    SW_SHOWMINNOACTIVATE:窗口最小化,激活窗口仍然维持激活状态。

    SW_SHOWNA:以窗口原来的状态显示窗口。激活窗口仍然维持激活状态。

    SW_SHOWNOACTIVATE:以窗口最近一次的大小和状态显示窗口。激活窗口仍然维持激活状态。

    SW_SHOWNOMAL:激活并显示一个窗口。如果窗口被最小化或最大化,系统将其恢复到原来的尺寸和大小。应用程序在第一次显示窗口的时候应该指定此标志。

    返回值:如果窗口以前可见,则返回值为非零。如果窗口以前被隐藏,则返回值为零。

    备注:应用程序第一次调用ShowWindow时,应该使用WinMain函数的nCmdshow参数作为它的nCmdShow参数。在随后调用ShowWindow函数时,必须使用列表中的一个给定值,而不是由WinMain函数的nCmdSHow参数指定的值。

Public Const SW_HIDE = 0

Public Const SW_SHOWNORMAL = 1

Public Const SW_SHOWMINIMIZED = 2

Public Const SW_SHOWMAXIMIZED = 3

Public Const SW_MAXIMIZE = 3

Public Const SW_SHOWNOACTIVATE = 4

Public Const SW_SHOW = 5

Public Const SW_MINIMIZE = 6

Public Const SW_SHOWMINNOACTIVE = 7

Public Const SW_SHOWNA = 8

Public Const SW_RESTORE = 9


原创粉丝点击