2009-05-01 2 views
2

창에 포커스가 있어도 비활성 상태로 유지하는 방법이 있습니까? 저는 두 가지 형태 (A와 B)를 가지고 있습니다. 사용자가 A와 상호 작용하면 B로 초점을 다시 전송합니다. 초점 전송의 결과 (사용자가 A를 클릭 한 다음 B로 다시 초점이 이동 됨)는 A 양식이 활성에서 비활성으로 tZ입니다. 이것은보기 흉하게 보입니다 (특히 Vista에서는 A가 잠시 더 큰 그림자를 얻습니다). 이 깜박임이 발생하지 않도록 A가 비활성 상태로 유지하도록하려면 어떻게해야합니까?활성화 된 상태에서도 모양이 창을 비활성 상태로 유지

답변

11

마침내 대답을 찾았습니다!

경고 : 이 답변의 기술을 남용하지 마십시오. 이렇게하면 사용자가 혼동을 느끼고 일반적으로 컴퓨팅 환경에 해를 끼칩니다. 아래에서 설명하는 기술은 특정 상황 (예 : IntelliSense와 유사한 동작)에서 매우 유용 할 수 있지만 으로 사용하십시오.

WM_NCACTIVATE 메시지는 비 클라이언트 영역 (즉, 경계 및 제목 표시 줄)의 상태를 비활성 또는 활성으로 변경하기 위해 창으로 전송됩니다. 메시지의 wParam은 상태가 비활성 상태인지 또는 활성 상태인지를 나타냅니다. wParam이 참이면 (값 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

GUI 모델의 기본 동작을 변경하는 것에 대해 이야기하고 있습니다. 그렇게 할 것을 권하지는 않습니다. 사용자가 A에서 무언가를하고 있다면 B로 돌아가서 A가 사라지지 않아야합니까? 왜 깜박입니까? 초점이 바뀌면 단일 스위치 여야합니다.

초점이 같은 전환되어 당신이 무엇을 설명에서 알 수 없습니다 :

A-> B
B-> A-> 사용자 클릭 -> B
B->은

?

+0

VisualStudio의 IntelliSense를 모방하려고합니다. A는 제안 창이고 B는 사용자가 텍스트를 입력하는 곳입니다. 사용자가 A (선택한 제안 변경 등)를 클릭하면 자동으로 포커스를 B로 설정하여 사용자가 포커스를 수동으로 설정할 필요없이 입력을 계속할 수 있습니다. 포커스 전송은 다음과 같습니다 : 포커스가 B로 설정되고, 사용자가 A로 클릭하면 위로 이동합니다. 포커스를 B로 다시 설정합니다. 일시적으로 포커스를 가져오고, 멈추려는 포커스의 깜박임 (또는 깜박임)을 가져옵니다. . –

0

이 방법이 도움이되는지는 확실하지 않지만 Winforms는 소유 한 양식의 개념을 지원합니다. 예를 들어 부동 도구 모음이 최상위 창 외부에있는 경우에도 최상위 창이 활성 상태 일 때도 활성 상태로 유지됩니다 (반대의 경우도 마찬가지 임). 마찬가지로 양식 B를 비활성화하지 않고도 사용자가 양식 A와 상호 작용할 수 있기를 원합니다.

a을 표시하기 직전에 b.AddOwnedForm(a)으로 전화해야하는 것처럼 들릴 수 있습니다.

+0

나는 당신의 제안을 시도했지만 안타깝게도 소유 된 창과 부모 창 사이를 전환하면 여전히 창의 모양이 비활성에서 활성으로 바뀝니다. –

관련 문제