활성화 된 경우에도 창을 비활성 상태로 유지하십시오
-
03-07-2019 - |
문제
초점이 포함되어 있어도 창을 비활성 상태로 유지하는 방법이 있습니까? 두 가지 형태 (A와 B)가 있습니다. 사용자가 A와 상호 작용 한 후, 초점을 B로 다시 전송합니다 (초점 전송 결과 (사용자는 A를 클릭 한 다음 B로 다시 전송되는 사용자)는 활성에서 비활성으로 깜박임이 형성되는 것입니다. 이것은 추악 해 보입니다 (특히 순간적으로 더 큰 그림자가있는 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는 소유 양식의 개념을 지원합니다. 예를 들어, 플로팅 툴바는 최상위 창 밖에서 살더라도 최상위 창이 활성화되어 있어도 활성으로 유지됩니다 (그 반대). 마찬가지로, 사용자가 양식 B를 비활성화하지 않고 양식 A와 상호 작용할 수 있기를 원합니다.
이를 달성하려면 전화해야 할 것 같습니다. b.AddOwnedForm(a)
당신이 보여주기 직전에 a
.