Сохраняйте внешний вид окна Неактивным Даже При Активации

StackOverflow https://stackoverflow.com/questions/813745

  •  03-07-2019
  •  | 
  •  

Вопрос

Есть ли способ сохранить окно неактивным, даже если оно содержит фокус?У меня есть две формы (A и B).После того, как пользователь взаимодействует с A, я переношу фокус обратно на B.Результатом переноса фокуса (пользователь нажимает на A, затем фокус переносится обратно на B) является то, что форма A мигает из активной в неактивную.Это выглядит некрасиво (особенно в Vista, где тень на мгновение становится больше).Как я могу настроить режим "Оставаться неактивным", чтобы этого мигания не происходило?

Это было полезно?

Решение

Наконец-то я нашел ответ!

ВНИМАНИЕ: НЕ злоупотребляйте техникой ответа. Это может сбить с толку ваших пользователей и повредить работе компьютера в целом. Описанная ниже методика может быть очень полезной при определенных обстоятельствах (например, реализация поведения, подобного IntelliSense), но пожалуйста будьте осторожны при ее использовании.

WM_NCACTIVATE отправляется на окно, чтобы изменить состояние своей не клиентской области (то есть границы и заголовка) на неактивное или активное. WParam сообщения указывает, будет ли состояние неактивным или активным. Если wParam имеет значение true (значение 1), окно будет выглядеть активным. Если wParam имеет значение false (значение 0), окно будет выглядеть неактивным. Чтобы заставить окно оставаться либо неактивным, либо активным, переопределите wParam, установив для него соответствующее значение (0 или 1), и все будет готово!

private const int WM_NCACTIVATE = 0x0086;

protected override void WndProc(ref Message m)
{
    if (m.Msg == WM_NCACTIVATE)
    {
        // Use this to make it always look inactive:
        m.WParam = (IntPtr)0;

        // Alternately, use this to make it always look active:
        m.WParam = (IntPtr)1;
    }

    base.WndProc(ref m);
}

Другие советы

Вы говорите об изменении поведения модели gui по умолчанию.Я бы не советовал этого делать.Если пользователь делает что-то на A, то, возвращаясь к B, разве A не должен исчезнуть?Почему он "мигает"?Это должен быть один переключатель, когда происходит смена фокуса.

Не могу сказать из того, что вы описываете, похоже ли переключение фокуса:

A->B
B-> A-> щелчок пользователя-> B
B->A

?

Не уверен, поможет ли это, но Winforms поддерживает концепцию собственных форм. Например, даже если плавающие панели инструментов находятся за пределами окна верхнего уровня, они остаются активными, даже когда окно верхнего уровня активно (и наоборот). Точно так же вы хотите, чтобы пользователь мог взаимодействовать с вашей формой A без деактивации формы B.

Чтобы добиться этого, вам нужно вызвать b.AddOwnedForm (a) непосредственно перед тем, как показать a .

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top