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

如何在C#中从控制台窗口返回焦点?

  •  7
  • Bitterblue  · 技术社区  · 10 年前

    我有一个C#控制台应用程序(a),它使用黑色窗口控制台打开。有时在启动时,它会抢走另一个程序的焦点 需要 焦点。

    问题: 我怎样才能从 A.exe B.exe ?

    A -> Focus -> B
    


    细节:
    • 程序B不是我的,我对此无能为力。它有一个GUI,多个窗口,其中一个需要焦点(可能是一个模态对话框窗口)。
    • 程序A不需要任何关注,也不以任何方式与程序B交互。
    • 程序A通过启动快捷方式启动,并基本上在后台运行(它已发布,但仍在开发中,这就是控制台窗口的原因)
    • 我有几分钟/几分钟的时间来检查并重新聚焦。
    2 回复  |  直到 10 年前
        1
  •  7
  •   Bitterblue    10 年前
    // this should do the trick....
    
    [DllImport("user32.dll")]
    public static extern bool ShowWindowAsync(HandleRef hWnd, int nCmdShow);
    [DllImport("user32.dll")]
    public static extern bool SetForegroundWindow(IntPtr WindowHandle);
    
    public const int SW_RESTORE = 9;
    
    private void FocusProcess(string procName)
    {
        Process[] objProcesses = System.Diagnostics.Process.GetProcessesByName(procName);
        if (objProcesses.Length > 0)
        {
            IntPtr hWnd = IntPtr.Zero;
            hWnd = objProcesses[0].MainWindowHandle;
            ShowWindowAsync(new HandleRef(null,hWnd), SW_RESTORE);
            SetForegroundWindow(objProcesses[0].MainWindowHandle);
        }
    }
    
        2
  •  1
  •   Gabe Halsmer    5 年前

    要为当前正在运行的C#控制台应用程序执行此操作。。。

    [DllImport("user32.dll")]
    public static extern bool ShowWindowAsync(HandleRef hWnd, int nCmdShow);
    [DllImport("user32.dll")]
    [return: MarshalAs(UnmanagedType.Bool)]
    static extern bool SetForegroundWindow(IntPtr hWnd);
    [DllImport("user32.dll", EntryPoint = "FindWindow", SetLastError = true)]
    static extern IntPtr FindWindowByCaption(IntPtr zeroOnly, string lpWindowName);
    public const int SW_RESTORE = 9;
    static void FocusMe()
    {
        string originalTitle = Console.Title;
        string uniqueTitle = Guid.NewGuid().ToString();
        Console.Title = uniqueTitle;
        Thread.Sleep(50);
        IntPtr handle = FindWindowByCaption(IntPtr.Zero, uniqueTitle);
    
        Console.Title = originalTitle;
    
        ShowWindowAsync(new HandleRef(null, handle), SW_RESTORE);
        SetForegroundWindow(handle);
    }