Корректный путь (в.NET) для переключения фокуса на другое приложение

Это - то, что я имею до сих пор:

    Dim bProcess = Process.GetProcessesByName("By").FirstOrDefault
    If bProcess IsNot Nothing Then
        SwitchToThisWindow(bProcess.MainWindowHandle, True)
    Else
        Process.Start("C:\Program Files\B\B.exe")
    End If

Это имеет две проблемы.

  1. Некоторые люди сказали мне, что SwitchToThisWindow удерживается от использования.
  2. Если приложение B минимизировано, эта функция тихо перестала работать с точки зрения пользователя.

Таким образом, что правильный путь состоит в том, чтобы сделать это?

35
задан caesay 23 February 2010 в 04:37
поделиться

1 ответ

Получите хэндл окна (hwnd), а затем используйте эту функцию user32.dll:

Объявление VB.net:

Declare Function SetForegroundWindow Lib "user32.dll" (ByVal hwnd As Integer) As Integer 

Объявление C#:

[DllImport("user32.dll")] public static extern int SetForegroundWindow(int hwnd) 

Одно соображение заключается в том, что это не будет работать, если окно свернуто, поэтому я написал следующий метод, который работает и в этом случае. Вот код на C#, перенос его на VB должен быть достаточно простым.

[System.Runtime.InteropServices.DllImport("user32.dll")]
[return: System.Runtime.InteropServices.MarshalAs(System.Runtime.InteropServices.UnmanagedType.Bool)]
private static extern bool ShowWindow(IntPtr hWnd, ShowWindowEnum flags);

[System.Runtime.InteropServices.DllImport("user32.dll")]
private static extern int SetForegroundWindow(IntPtr hwnd);

private enum ShowWindowEnum
{
    Hide = 0,
    ShowNormal = 1, ShowMinimized = 2, ShowMaximized = 3,
    Maximize = 3, ShowNormalNoActivate = 4, Show = 5,
    Minimize = 6, ShowMinNoActivate = 7, ShowNoActivate = 8,
    Restore = 9, ShowDefault = 10, ForceMinimized = 11
};

public void BringMainWindowToFront(string processName)
{
    // get the process
    Process bProcess = Process.GetProcessesByName(processName).FirstOrDefault();

    // check if the process is running
    if (bProcess != null)
    {
        // check if the window is hidden / minimized
        if (bProcess.MainWindowHandle == IntPtr.Zero)
        {
            // the window is hidden so try to restore it before setting focus.
            ShowWindow(bProcess.Handle, ShowWindowEnum.Restore);
        }

        // set user the focus to the window
        SetForegroundWindow(bProcess.MainWindowHandle);
    }
    else
    {
        // the process is not running, so start it
        Process.Start(processName);
    }
}

Используя этот код, будет просто установить соответствующие переменные процесса и вызвать BringMainWindowToFront("processName");

36
ответ дан 27 November 2019 в 06:43
поделиться
Другие вопросы по тегам:

Похожие вопросы: