如何将非托管应用程序窗口置于前台,并使其成为(模拟)用户输入的活动窗口

本文关键字:窗口 活动 输入 用户 模拟 前台 应用程序 于前台 | 更新日期: 2023-09-27 17:58:16

我假设我需要使用pinvoke,但我不确定需要哪些函数调用。

场景:一个遗留应用程序将运行,我将拥有该应用程序的句柄。

我需要:

  1. 将该应用程序置于顶部(在所有其他窗口前面)
  2. 使其成为活动窗口

需要哪些Windows函数调用?

如何将非托管应用程序窗口置于前台,并使其成为(模拟)用户输入的活动窗口

如果您没有窗口的句柄,请在以下操作之前使用:

[DllImport("user32.dll", SetLastError = true)]
static extern IntPtr FindWindow(string lpClassName, string lpWindowName);

现在假设您有一个应用程序窗口的句柄:

[DllImport("user32.dll", SetLastError = true)]
static extern bool SetForegroundWindow(IntPtr hWnd);

如果另一个窗口有键盘焦点,这将使任务栏闪烁。

如果要强制窗口位于前面,请使用ForceForegroundWindow(示例实现)。

这已经被证明是非常可靠的。ShowWindowAsync函数是专门为不同线程创建的窗口设计的。SW_SHOWDEFAULT确保窗口在显示前已还原,然后激活。

    [DllImport("user32.dll", SetLastError = true)]
    internal static extern bool ShowWindowAsync(IntPtr windowHandle, int nCmdShow);
    [DllImport("user32.dll", SetLastError = true)]
    internal static extern bool SetForegroundWindow(IntPtr windowHandle);

然后打电话:

ShowWindowAsync(windowHandle, SW_SHOWDEFAULT);
ShowWindowAsync(windowHandle, SW_SHOW);
SetForegroundWindow(windowHandle);
    [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;

ShowWindowAsync方法用于显示最小化的应用程序,SetForegroundWindow方法用于显示前面的应用程序。

您可以使用这些方法,就像我在应用程序中使用的方法一样,将skype带到应用程序的前面。点击按钮点击

private void FocusSkype()
    {
        Process[] objProcesses = System.Diagnostics.Process.GetProcessesByName("skype");
        if (objProcesses.Length > 0)
        {
            IntPtr hWnd = IntPtr.Zero;
            hWnd = objProcesses[0].MainWindowHandle;
            ShowWindowAsync(new HandleRef(null,hWnd), SW_RESTORE);
             SetForegroundWindow(objProcesses[0].MainWindowHandle);
        }
    }