Держите окно неактивным по внешнему виду, даже когда активировано - PullRequest
2 голосов
/ 02 мая 2009

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

Ответы [ 3 ]

11 голосов
/ 03 мая 2009

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

ПРЕДУПРЕЖДЕНИЕ: НЕ злоупотребляйте техникой ответа. Это может сбить с толку ваших пользователей и нанести вред работе компьютера в целом. Методика, описанная ниже, может быть очень полезна при определенных обстоятельствах (например, реализация поведения, подобного 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);
}
0 голосов
/ 02 мая 2009

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

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

0 голосов
/ 02 мая 2009

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

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

А-> В
B-> A-> пользовательский щелчок-> B
B-> A

...