Как вывести передний план окна с помощью c #? - PullRequest
6 голосов
/ 01 февраля 2011

Я пытаюсь вывести окно на передний план.Я использую этот код.Но это не работает.Может кто-нибудь помочь, пожалуйста?

ShowWindowAsync(wnd.hWnd, SW_SHOW);

SetForegroundWindow(wnd.hWnd);
// Code from Karl E. Peterson, www.mvps.org/vb/sample.htm
// Converted to Delphi by Ray Lischner
// Published in The Delphi Magazine 55, page 16
// Converted to C# by Kevin Gale
IntPtr foregroundWindow = GetForegroundWindow();
IntPtr Dummy = IntPtr.Zero;

uint foregroundThreadId = GetWindowThreadProcessId(foregroundWindow, Dummy);
uint thisThreadId = GetWindowThreadProcessId(wnd.hWnd, Dummy);

 if (AttachThreadInput(thisThreadId, foregroundThreadId, true))
 {
    BringWindowToTop(wnd.hWnd); // IE 5.5 related hack
    SetForegroundWindow(wnd.hWnd);
    AttachThreadInput(thisThreadId, foregroundThreadId, false);
 }

 if (GetForegroundWindow() != wnd.hWnd)
 {
     // Code by Daniel P. Stasinski
     // Converted to C# by Kevin Gale
    IntPtr Timeout = IntPtr.Zero;
    SystemParametersInfo(SPI_GETFOREGROUNDLOCKTIMEOUT, 0, Timeout, 0);
    SystemParametersInfo(SPI_SETFOREGROUNDLOCKTIMEOUT, 0, Dummy, SPIF_SENDCHANGE);
    BringWindowToTop(wnd.hWnd); // IE 5.5 related hack
    SetForegroundWindow(wnd.hWnd);
    SystemParametersInfo(SPI_SETFOREGROUNDLOCKTIMEOUT, 0, Timeout, SPIF_SENDCHANGE);
 }

Код объяснения

Создание окна переднего плана требует больше, чем просто вызов API SetForegroundWindow.Сначала вы должны определить поток переднего плана и прикрепить его к окну, используя AttachThreadInput, а затем вызвать SetForegroundWindow.Таким образом они могут совместно использовать входные состояния.

Сначала я вызываю GetForegroundWindow, чтобы получить дескриптор текущего окна переднего плана.Затем несколько вызовов GetWindowThreadProcessId извлекают потоки, связанные с текущим окном переднего плана и окном, которое я хочу вывести на передний план.Если эти потоки одинаковы, простой вызов SetForegroundWindow - это все, что необходимо.В противном случае нить переднего плана прикрепляется к окну, которое я вывожу на передний план, и отсоединяется от текущего окна переднего плана.API-интерфейс AttachThreadInput обрабатывает это.

Содержимое взято с здесь Спасибо.

Ответы [ 6 ]

12 голосов
/ 02 февраля 2011

Я использовал этот метод раньше:

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

    Process[] processes = Process.GetProcessesByName("processname");
    SetForegroundWindow(processes[0].MainWindowHandle);

Дополнительная информация: http://pinvoke.net/default.aspx/user32.SetForegroundWindow

6 голосов
/ 13 мая 2014

Этот код восстанавливает и устанавливает фокус на окно:

    [DllImport("User32.dll")]
    static extern int SetForegroundWindow(IntPtr hWnd);

    [DllImport("user32.dll")]
    internal static extern bool SendMessage(IntPtr hWnd, Int32 msg, Int32 wParam, Int32 lParam);
    static Int32 WM_SYSCOMMAND = 0x0112;
    static Int32 SC_RESTORE = 0xF120;

И используйте это так:

    var proc = Process.GetProcessesByName("YourProgram").FirstOrDefault();

    if (proc != null)
    {
        var pointer = proc.MainWindowHandle;

        SetForegroundWindow(pointer);
        SendMessage(pointer, WM_SYSCOMMAND, SC_RESTORE, 0);
    }
2 голосов
/ 19 декабря 2014

Чтобы SetForegroundWindow работало согласованно, вам необходимо соответствовать нескольким критериям .Во-первых, ваш процесс, который запускает команду, должен находиться на переднем плане.Только процесс переднего плана может сделать другой процесс передним планом.Чтобы сначала сделать ваш процесс приоритетным, вы должны вывести главное окно на передний план, если это не так.Сначала вы минимизируете его, а затем SetForegroundWindow, чтобы сделать его приоритетным.Теперь найдите целевой процесс и выведите его на передний план

. Шаги:

У меня есть пример , хотя это немного другой вариант использования.

1 голос
/ 01 февраля 2011

Буду краток: Form.BringToFront ()

1 голос
/ 01 февраля 2011

Вы должны использовать SetForegroundWindow. Также вам может быть интересно C # Force Form Focus

0 голосов
/ 25 января 2013

Начиная с Windows 7, эти функции работают не так хорошо.Если есть приложение, например Excel, перед приложением, которое вы хотите перенести на передний план, Windows 7 блокирует его и открывает окно.Вы можете установить значение времени ожидания реестра ForegroundLockTimeout = 0 в HKEY_CURRENT_USER \ Панель управления \ Рабочий стол, но это называется фокусом кражи.Чтобы установить поведение поведения XP в Windows 7 по умолчанию, вы можете создать / установить значение 0x00030D40 (200000 мс).Я хотел бы знать, что является предпочтительным решением для доверенных приложений Windows.например.Если я доверяю приложению B фокусироваться, когда я дважды щелкаю что-то в приложении A, а какое-то другое приложение закрывает окно приложения B.

...