翼度科技»论坛 编程开发 .net 查看内容

C# 保持程序唯一性打开的一种方式

5

主题

5

帖子

15

积分

新手上路

Rank: 1

积分
15

  • 概述
    之前在博客园找了好久,就这么一个小功能,卡了好几天没解决就只能暂时放弃,直到半年后才偶然看到同事写的,感觉挺好的,记录一下顺便分享。有用可以点个赞。转载请注明出处,谢谢。
 

  • 代码:查看程序是否已经运行
  1. /// <summary>
  2. /// 查看程序是否已经运行
  3. /// </summary>
  4. /// <returns></returns>
  5. public static Process GetExistProcess()
  6. {
  7.     Process currentProcess = Process.GetCurrentProcess();//当前程序
  8.     foreach (Process process1 in Process.GetProcessesByName(currentProcess.ProcessName))
  9.     {
  10.         //同名程序有2个或者2个以上
  11.         if (process1.Id != currentProcess.Id)
  12.         {
  13.             return process1;//返回另外一个同名程序的进程
  14.         }
  15.     }
  16.     return null;
  17. }
复制代码
 

  • 代码:调用
  1. static class Program
  2. {
  3.     /// <summary>
  4.     /// 应用程序的主入口点。
  5.     /// </summary>
  6.     [STAThread]
  7.     static void Main()
  8.     {
  9.         Application.EnableVisualStyles();
  10.         Application.SetCompatibleTextRenderingDefault(false);
  11.         var runningProcess = GetExistProcess();
  12.         if (runningProcess != null) //同名程序已经在运行
  13.         {
  14.             IntPtr mainWindowHandle1 = runningProcess.MainWindowHandle;
  15.             if (mainWindowHandle1 == IntPtr.Zero)//窗口被隐藏了
  16.             {
  17.                 //目标窗体的 Text 属性中的字符串
  18.                 mainWindowHandle1 = FindWindow(null, "唯一程序");
  19.             }
  20.             ShowWindowAsync(mainWindowHandle1, 1);
  21.             SetForegroundWindow(mainWindowHandle1);
  22.         }
  23.         else
  24.         {
  25.             Application.Run(new MainForm());
  26.         }
  27.     }
  28. }
复制代码
 
 
代码:Win32API
  1. //根据任务栏应用程序显示的名称找窗口的名称
  2. [DllImport("User32.dll", EntryPoint = "FindWindow")]
  3. public static extern IntPtr FindWindow(string lpClassName, string lpWindowName);
  4. /// <summary>
  5. /// 该函数设置由不同线程产生的窗口的显示状态
  6. /// </summary>
  7. /// <param name="hWnd">窗口句柄</param>
  8. /// <param name="nCmdShow">指定窗口如何显示。查看允许值列表,请查阅ShowWlndow函数的说明部分</param>
  9. /// <returns></returns>
  10. [DllImport("user32.dll")]
  11. public static extern bool ShowWindowAsync(IntPtr hWnd, int nCmdShow);
  12. /// <summary>
  13. /// 该函数将创建指定窗口的线程设置到前台,并且激活该窗口。键盘输入转向该窗口,并为用户改各种可视的记号。
  14. /// </summary>
  15. /// <param name="hWnd"></param>
  16. /// <returns>如果窗口设入了前台,返回值为非零;如果窗口未被设入前台,返回值为零</returns>
  17. [DllImport("user32.dll ")]
  18. public static extern bool SetForegroundWindow(IntPtr hWnd);
复制代码
 

来源:https://www.cnblogs.com/tpen/p/18561119
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!

举报 回复 使用道具