【问题标题】:Possible to start process, minimize window, on click open same window process? [duplicate]可以启动进程,最小化窗口,单击打开相同的窗口进程? [复制]
【发布时间】:2021-11-27 10:00:16
【问题描述】:

我有一个全屏应用程序,它隐藏了 Windows 自己的任务栏(应该如此)。我有一个启动 IE 进程的按钮方法

 Process.Start(pathWayToIE);

这很好用,但是当最小化该窗口时,我无法再次访问它,因为任务栏已隐藏,正如我想要的那样。有没有办法在同一个按钮单击时找到相同的进程并最大化该窗口,而不是打开一个新的 IE 窗口?

我确实有这个语句来查看一个窗口是否已经打开

var proc = Process.GetProcesses();
            

            for(var i = 0; i < proc.Length; ++i)
            {
                if(proc[i].ProcessName == "msedge")
                {
                    appName = proc[i].ProcessName;
                    appId = proc[i].Id;
                }
              
            }
int count = Process.GetProcesses().Where(p => p.ProcessName == appName).Count();

if (count > 1)
            {
                MessageBox.Show("A window is already open!");
            }

所以要查看一个窗口是否真的打开了,但是如何再次最大化它我很纠结。

整个方法如下所示:

private void IE_Button_Click(object sender, RoutedEventArgs e)
        {

            var startEdge = @"pathwayToIE";
            
            var appName = "";
            var appId = 0;

            var proc = Process.GetProcesses();
            

            for(var i = 0; i < proc.Length; ++i)
            {
                if(proc[i].ProcessName == "msedge")
                {
                    appName = proc[i].ProcessName;
                    appId = proc[i].Id;
                }
              
            }

            Process myEdgeProcess = new Process();
            ProcessStartInfo procStartInfo = new ProcessStartInfo(startEdge);

            myEdgeProcess.StartInfo.FileName = startEdge;

            int count = Process.GetProcesses().Where(p => p.ProcessName == appName).Count();

            int currentRunningInstance = Process.GetProcesses().Where(c => c.Id == appId).Count();

            if (count > 1)
            {
                MessageBox.Show("A window is already open!");
            }
            else
            {
              
                Process.Start(procStartInfo);
              
            }

         }

提前感谢您的提示

【问题讨论】:

  • 如果您没有任务栏,但需要在窗口之间切换 - 使用 Alt+Tab :)
  • @Auditive 哦,我的错,我忘了补充说我要禁用所有热键命令,或者至少尝试一下,因为我不希望用户能够自行退出应用程序

标签: c# wpf


【解决方案1】:

您可以通过 P/Invoke ShowWindow 方法最大化进程窗口。 将此代码添加到您的课程中:

const int SW_SHOWMAXIMIZED = 3;

[System.Runtime.InteropServices.DllImport("user32.dll")]
static extern bool ShowWindow(IntPtr hWnd, int nCmdShow);

你需要获取进程句柄,可以这样实现:

IntPtr handle = Process.GetProcesses()
                       .FirstOrDefault(p => p.ProcessName == "YourProcessName")
                       .MainWindowHandle;

然后调用ShowWindow,将句柄和常量值传递给它:

ShowWindow(handle, SW_SHOWMAXIMIZED);

完成:

static void Main(string[] args)
{
    Process yourProcess = Process.GetProcesses()
                                 .FirstOrDefault(p => p.ProcessName == "Viber");
    IntPtr handle = yourProcess.MainWindowHandle;

    ShowWindow(handle, SW_SHOWMAXIMIZED);

    Console.WriteLine("Process " + yourProcess.ProcessName + " window maximized!");
    Console.ReadKey();
}

关于ShowWindow你可以在这里阅读: https://docs.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-showwindow

【讨论】:

  • 几乎成功了!现在唯一的问题是,如果我关闭窗口,我无法打开一个新的 IE 窗口。表示 Object rerence 未设置为对象的实例
  • 需要您实现的代码示例。
  • Object reference 出现在ShowWindow 通话中?还是在哪里?
  • 你的例子有效,我可能错过了一个 ;某处或某事。谢谢好心人!
猜你喜欢
  • 1970-01-01
  • 2016-05-11
  • 1970-01-01
  • 2021-12-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-28
  • 1970-01-01
相关资源
最近更新 更多