转自:https://social.msdn.microsoft.com/Forums/zh-CN/6398fb10-ecc2-4c03-ab25-d03544f5fcc9/22914203093575320854201823244731243385443425530340200273138321?forum=visualcshartzhchs

我要实现的功能如下: 打开程序的时候先检查,如果这个程序已经在运行了,就直接将以前打开的程序窗口正常显示出来就行了。

我的代码如下,但隐藏的窗口不能显示出来,请问怎么改?

Program.cs

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Threading.Tasks;
  5. using System.Windows.Forms;
  6. using System.Runtime.InteropServices;
  7. using System.Diagnostics;
  8. using System.Reflection;
  9.  
  10. namespace 例子01
  11. {
  12. static class Program
  13. {
  14.  
  15. [DllImport("User32.dll")]
  16. private static extern bool ShowWindow(IntPtr hWnd, int cmdShow);
  17.  
  18. [DllImport("User32.dll")]
  19. private static extern bool SetForegroundWindow(IntPtr hWnd);
  20. private const int WS_SHOWNORMAL = 1;
  21.  
  22. /// <summary>
  23. /// 应用程序的主入口点。
  24. /// </summary>
  25. [STAThread]
  26. static void Main(string[] args)
  27. {
  28. Application.EnableVisualStyles();
  29. Application.SetCompatibleTextRenderingDefault(false);
  30. Process instance = RunningInstance();
  31. if (instance == null)
  32. {
  33. Application.Run(new Form1());
  34. }
  35. else
  36. {
  37. MessageBox.Show("程序已在运行中", "提示信息", MessageBoxButtons.OK, MessageBoxIcon.Information);
  38. HandleRunningInstance(instance);
  39. }
  40. }
  41.  
  42. /// <summary>
  43. /// 获取正在运行的实例,没有运行的实例返回null;
  44. /// </summary>
  45. public static Process RunningInstance()
  46. {
  47. Process current = Process.GetCurrentProcess();
  48. Process[] processes = Process.GetProcessesByName(current.ProcessName);
  49. foreach (Process process in processes)
  50. {
  51. if (process.Id != current.Id)
  52. {
  53. if (Assembly.GetExecutingAssembly().Location.Replace("/", "\\") == current.MainModule.FileName)
  54. {
  55. return process;
  56. }
  57. }
  58. }
  59. return null;
  60. }
  61.  
  62. /// <summary>
  63. /// 显示已运行的程序。
  64. /// </summary>
  65. public static void HandleRunningInstance(Process instance)
  66. {
  67. ShowWindow(instance.MainWindowHandle, WS_SHOWNORMAL); //显示,可以注释掉
  68. SetForegroundWindow(instance.MainWindowHandle); //放到前端
  69. }
  70.  
  71. }
  72. }

你这个代码我在博客园看到了,文章中已经明确指出 “只有窗口最小化的时候可以达到此效果,如果隐藏到托盘则无法将打开的程序显示到桌面”,所以你上面的代码根本无法达到你的目的的,要实现你说的需求你需要用到FindWindow 函数,具体实现代码如下:

  1. static class Program
  2. {
  3. [DllImport("user32.dll")]
  4. public static extern IntPtr FindWindow(string lpClassName, string lpWindowName);
  5. [DllImport("user32.dll ", SetLastError = true)]
  6. static extern void SwitchToThisWindow(IntPtr hWnd, bool fAltTab);
  7.  
  8. [DllImport("user32.dll", EntryPoint = "ShowWindow", CharSet = CharSet.Auto)]
  9. public static extern int ShowWindow(IntPtr hwnd, int nCmdShow);
  10. public const int SW_RESTORE=9;
  11. public static IntPtr formhwnd;
  12. static Form1 form = null;
  13. ///<summary>
  14. /// 应用程序的主入口点。
  15. ///</summary>
  16. [STAThread]
  17. static void Main()
  18. {
  19. Application.EnableVisualStyles();
  20. Application.SetCompatibleTextRenderingDefault(false);
  21.  
  22. string proc = Process.GetCurrentProcess().ProcessName;
  23. Process[] processes = Process.GetProcessesByName(proc);
  24. if (processes.Length <= 1)
  25. {
  26. form = new Form1();
  27. Application.Run(form);
  28. }
  29. else
  30. {
  31. for (int i = 0; i < processes.Length; i++)
  32. {
  33. if (processes[i].Id != Process.GetCurrentProcess().Id)
  34. {
  35. if (processes[i].MainWindowHandle.ToInt32() == 0)
  36. {
  37. formhwnd = FindWindow(null, "Form1");
  38. ShowWindow(formhwnd,SW_RESTORE);
  39. SwitchToThisWindow(formhwnd, true);
  40. }
  41. else
  42. {
  43. SwitchToThisWindow(processes[i].MainWindowHandle, true);
  44. }
  45. }
  46.  
  47. }
  48. }
  49.  
  50. }
  51. }

需要注意:

是可以的,不过要注意一点就是下面这句代码中的"Form1",放到自己的程序中要注意替换。这里要替换为 “目标窗体”的标题,即目标窗体的 Text 属性中的字符串

c# 程序只能运行一次(多次运行只能打开同一个程序)的更多相关文章

  1. 在文件夹中 的指定类型文件中 查找字符串(CodeBlocks+GCC编译,控制台程序,仅能在Windows上运行)

    说明: 程序使用 io.h 中的 _findfirst 和 _findnext 函数遍历文件夹,故而程序只能在 Windows 下使用. 程序遍历当前文件夹,对其中的文件夹执行递归遍历.同时检查遍历到 ...

  2. [转]C#程序无法在64位系统上运行之.NET编译的目标平台

    今天将编译的C#的exe拷贝到测试机上(Win7_64bit),一运行就挂了,提示“stop working”,一开始怀疑测试机上没有安装.net framework框架,追究半天原来是编译的目标平台 ...

  3. (转载)用VS2012或VS2013在win7下编写的程序在XP下运行就出现“不是有效的win32应用程序“

    原文地址:http://www.vcerror.com/?p=1483 问题描述: 用VC2013编译了一个程序,在Windows 8.Windows 7(64位.32位)下都能正常运行.但在Win ...

  4. vs2005 ,2008,2010中引入app.manifest(即c#程序在win7下以管理员权限运行方法)

    打开VS2005.VS2008.VS2010工程,查看工程文件夹中的Properties文件夹下是否有app.manifest这个文件:如没有,按如下方式创建:鼠标右击工程在菜单中选择“属性”,点击工 ...

  5. 干净win7要做几步才能运行第一个Spring MVC 写的动态web程序

    干净win7要做几步才能运行第一个Spring MVC 写的动态web程序: 1. 下载安装jdk 2. 配置Java环境变量 3. 测试一下第1,2两步是否完全成功:http://jingyan.b ...

  6. Ubuntu16.04下写的Qt程序,调试时没问题,运行时偶现崩溃 (需要在运行时生成core dump文件,QMAKE_CC += -g)

    记录一下 Ubuntu16.04下写的Qt程序,调试时没问题,运行时偶现崩溃 需要在运行时生成core dump文件 首先在pro结尾里加入 QMAKE_CC += -g QMAKE_CXX += - ...

  7. ARM裸板开发:04_MMU 链接地址与运行地址不一致时,(SDRAM)初始化程序地址无关码问题的分析

    ARM裸板开发过程,程序的链接地址设置为为0x30000000,而前期的启动代码以及相关硬件的初始化代码需要在内部iRAM(steppingstone,起始地址0x0)的4K中运行.链接地址与运行地址 ...

  8. 在“开始”菜单中的“运行”一栏输入特定命令打开windows程序

    winver 检查Windows版本   wmimgmt.msc 打开Windows管理体系结构(wmi)   wupdmgr Windows更新程序   wscript Windows脚本宿主设置 ...

  9. IntelliJ IDEA编写的spark程序在远程spark集群上运行

    准备工作 需要有三台主机,其中一台主机充当master,另外两台主机分别为slave01,slave02,并且要求三台主机处于同一个局域网下 通过命令:ifconfig 可以查看主机的IP地址,如下图 ...

随机推荐

  1. centos 6.5 下 nginx 简单优化_虚拟主机_负载均衡

    # 用了nginx for win很久,安装也是超级简单.# 还是用一下linux版的吧.环境是centos 6.5 x64 # 安装开始: # 先安装依赖 yum install gcc-c++ y ...

  2. Testner测试圈关于页面响应时间的测试行业标准

    Testner测试圈针对小程序页面的响应时间标准建议如下:0-2秒 用户体验好,可以选择性改善,如首屏体验做到秒开等2-4秒 用户体验一般,有改善空间4-6秒 用户体验较差,有较大改善空间6秒以上 用 ...

  3. React 组件框架

  4. pycharm中字体大小的调整方法

    一.file->settings->editor->font->size 二.file中键入mouse,在其下editor->general->mouse选中:ch ...

  5. Selenium-java测试环境搭建

    1.1背景 Selenium也是一个用于Web应用程序测试的工具.Selenium测试直接运行在浏览器中,就像真正的用户在操作一样.支持的浏览器包括IE.Mozilla Firefox.Mozilla ...

  6. CSS grid 模板

    在gridCSS属性速记属性显式设置所有的网格性质(grid-template-rows,grid-template-columns,和grid-template-areas和所有的网格性质(隐式gr ...

  7. KeepAlive--高可用解决方案

     原文地址https://segmentfault.com/a/1190000011078937 一:keepalive简述 一;高可用的解决方案 1)vrrp协议的实现keepalive 2)ais ...

  8. Qt + VS2013

    参考文章: https://blog.csdn.net/u013447988/article/details/76170070

  9. 电脑小知识-win10

    设置开机自启 一直想设置几个软件开机自启,尤其是文件搜索类和截图软件,不然每次打开电脑都要双击好几个工具,下面就记录一下如何设置开机自启. 1.先打开咱们的任务管理器,看看都有什么是开机自启的: 可以 ...

  10. Good Time------打卡让生活更美好

    Section 1团队介绍 Part 1 队员信息 姓名 学号 职务 王怡镔 2016012045 组长 于鑫宇 2016012029 组员 张济吨 2016012072 组员 黄鹤 20160120 ...