使用WPF 当程序已打开时第二次打开程序直接弹出第一次打开的程序

在代码中增加

  [DllImport("user32.dll")]
  private static extern bool SetForegroundWindow(IntPtr hWnd);
  [DllImport("user32.dll")]
  private static extern bool ShowWindowAsync(IntPtr hWnd, int nCmdShow);
  [DllImport("user32.dll")]
  private static extern bool IsIconic(IntPtr hWnd);
  private const int SW_RESTORE = 9;
  /// <summary>
  /// 激活已打开窗口
  /// </summary>
  public static void RaiseOtherProcess()
  {
      Process proc = Process.GetCurrentProcess();
      foreach (Process otherProc in
      Process.GetProcessesByName(Process.GetCurrentProcess().ProcessName))
      {
          if (proc.Id != otherProc.Id)
          {
              IntPtr hWnd = otherProc.MainWindowHandle;
              if (IsIconic(hWnd))
              {
                  ShowWindowAsync(hWnd, 9);
              }
              SetForegroundWindow(hWnd);
              break;
          }
      }
  }

然后就是调用:

  string strProcessName = System.Diagnostics.Process.GetCurrentProcess().ProcessName;
  //检查进程是否已经启动,已经启动则退出程序,显示已启动的程序。
  if (System.Diagnostics.Process.GetProcessesByName(strProcessName).Length > 1)
  {
      RaiseOtherProcess();
      Application.Current.Shutdown();
      return;
  }

我是直接写在Application_Startup 中
来源:https://www.cnblogs.com/webenh/p/17639905.html

WPF应用程序中,如果你想要让程序第二次打开自动置于任务栏的顶部并避免堆叠窗口,你可以通过以下步骤实现: 1. **保存窗体状态**: 在用户关闭窗口,保存窗体的位置、大小和其他设置。这通常通过`Window.Close`事件或者`Application.Exit`事件监听,并将窗口的状态存储到本地数据库、配置文件或其他持久化存储。 ```csharp private void Window_Closing(object sender, System.ComponentModel.CancelEventArgs e) { // 保存窗口位置信息 var windowPlacement = this.RestoreBounds; // 或者使用其他方法获取位置数据 SaveWindowPlacement(windowPlacement); } private void SaveWindowPlacement(Rect placement) { // 将placement对象序列化或转换为适合存储的数据结构 } ``` 2. **检查是否已打开**: 在应用程序启动,检查之前保存的窗口位置是否存在。如果存在,则恢复窗口的布局并将其置于任务栏顶部。 ```csharp private void Application_Startup(object sender, StartupEventArgs e) { // 从存储中加载之前的窗口位置 var storedPlacement = LoadWindowPlacement(); if (storedPlacement != null) { // 创建或找到对应的窗口,然后设置其位置 var mainWindow = new MainWindow(); mainWindow.RestoreBounds = storedPlacement; // 设置窗口在任务栏的显示选项,如TopMost属性 mainWindow.Topmost = true; mainWindow.Show(); } else { // 如果没有找到保存的放置信息,正常启动 MainWindow mainWindow = new MainWindow(); mainWindow.Show(); } } private Rect? LoadWindowPlacement() { // 从存储中尝试读取窗口位置 return /*从数据库或其他地方读取数据*/; } ``` 请注意,`TopMost`属性会使窗口始终处于最前面,但是可能会有性能影响,并可能导致其他窗口无法接收焦点。在实际应用中,你可能需要权衡这种效果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

weixin_40883328

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值