代码之家  ›  专栏  ›  技术社区  ›  CorellianAle

ShowWindow无法关注Win10计算器应用程序[重复]

  •  1
  • CorellianAle  · 技术社区  · 6 年前

            System.Diagnostics.Process[] myProcesses = System.Diagnostics.Process.GetProcesses();
            System.Diagnostics.Process me = System.Diagnostics.Process.GetCurrentProcess();
            foreach (System.Diagnostics.Process p in myProcesses)
            {
                if (p.ProcessName == me.ProcessName)
                    if (p.Id != me.Id)
                    {
                        //if already running, abort this copy.
                        return;
                    }
            }
            //launch the application.
            //...
    

    很好用。我也希望它能够集中已经运行的副本的形式。也就是说,在返回之前,我想把这个应用程序的另一个实例放到前台。

    SetForeGroundWindow在某种程度上起作用:

        [System.Runtime.InteropServices.DllImport("user32.dll")]
        public static extern bool SetForegroundWindow(IntPtr hWnd); 
    
        //...
                    if (p.Id != me.Id)
                    {
                        //if already running, focus it, and then abort this copy.
                        SetForegroundWindow(p.MainWindowHandle);
                        return;
                    }
        //...
    

    如果没有最小化窗口,它确实会将窗口带到前台。令人惊叹的。

    通过切换到此窗口的解决方案(工作!):

        [System.Runtime.InteropServices.DllImport("user32.dll")]
        public static extern void SwitchToThisWindow(IntPtr hWnd, bool fAltTab);
    
        [STAThread]
        static void Main()
        {
            System.Diagnostics.Process me = System.Diagnostics.Process.GetCurrentProcess();
            System.Diagnostics.Process[] myProcesses = System.Diagnostics.Process.GetProcessesByName(me.ProcessName);
            foreach (System.Diagnostics.Process p in myProcesses)
            {
                if (p.Id != me.Id)
                {
                    SwitchToThisWindow(p.MainWindowHandle, true);
                    return;
                }
            }
            //now go ahead and start our application ;-)
    
    0 回复  |  直到 15 年前
        1
  •  0
  •   bN_    4 年前

    我也有同样的问题 SwitchToThisWindow() 对我来说效果最好。唯一的限制是必须安装XP sp1。我玩了setforegroundindow,ShowWindow,他们都有问题拉窗口进入视野。