2009-09-21 3 views
1

IM 프로그램을 작성 중입니다. 양식을 플래시로 만들고 플래싱을 중지하는 방법이 있습니다 ... 질문은 어떻게 구현합니까?언제 양식을 플래시하고 깜박임을 멈추게합니까?

메시지가 도착하면 창이 깜박이도록 설정할 수 있지만 포커스가 없는지 확인해야합니다. focued 메소드를 검사하는 것은 항상 false를 반환하는 것처럼 보이므로 양식이 열려 있어도 깜박입니다.

또한 깜박임을 멈추기 위해 어떤 이벤트를 처리해야합니까? 사용자가 폼을 클릭하여 최대화하거나 폼으로 포커스를 전환하면이를 중지 할 방법이 필요합니다.

가장 좋은 방법은 무엇입니까? 폼이 사용자 또는 코드에 의해 활성화 될 때

if (this.WindowState == FormWindowState.Minimized) 
{ 
    MakeFormFlash(); 
} 
else 
{ 
    MakeFormStopFlash(); 
} 

이벤트 트리거 : 폼이 최소화되거나되지 않은 경우

+0

Focused 속성이 아닌 Focused (포커스) 확인 방법을 사용하고 있지 않습니까? – ICR

답변

1

당신은 활성화 처리 및 이벤트를 비활성화 할 수 있습니다 Form을 선택하고 양식에서 포커스가 있는지 여부를 코드에 알려주는 Form-level 부울을 변경하려면 다음과 같이하십시오.

private bool _IsActivated = false; 
private void Form1_Activated(object sender, EventArgs e) 
{ 
    _IsActivated = true; 
    // turn off flashing, if necessary 
} 
private void Form1_Deactivate(object sender, EventArgs e) 
{ 
    _IsActivated = false; 
} 

메시지가 도착하면 _IsActivated을 확인하여 양식이 이미 활성 창인지 확인하고 그렇지 않은 경우 깜박임을 설정하십시오. Activated 이벤트가 켜지면 깜박임을 해제합니다.

폼의 Focused 속성은 컨트롤이있는 경우 항상 false을 반환합니다. 이 속성은 문제의 컨트롤 (이 경우 양식)이 응용 프로그램의 양식 내에 포커스가 인지 여부를 나타내며 응용 프로그램 자체가 Windows 내에서 포커스를 가지는지 여부를 나타냅니다.

+0

활성화를위한 개인 변수를 만들 필요가 없습니다. Form.ActiveForm은 응용 프로그램의 현재 활성 양식을 제공합니다. – James

+0

@James :이 경우에는 여전히 개인 변수를 사용합니다. 그렇지 않으면 응용 프로그램에 Windows 포커스가 있는지 확인하려면 "if (Form.ActiveForm == this) {}"와 같은 작업을 수행해야합니다. 그것은 하나의 6 분의 1, 다른 하나는 6 분의 1입니다. – MusiGenesis

+0

또는 IsActivated라는 형식의 공용 readonly 속성을 만들면 그 결과가 언급 한 코드와 정확하게 일치 할 수 있습니다. – James

0

확인

this.Activated += new EventHandler(Form_Activated); 
+0

이것은 OP가 형식 중심으로 언급하는 문제를 완화하지 못합니다. – Joey

+0

그렇지 않습니까? 내가 잘못 이해 한 경우 OP 문제를 설명 할 수 있습니까? – Phoexo

+0

필자가 이해하는 한, (a) 창을 활성화 할 때 (창 관리자가 이미 수행 할 수 있음) 플래시를 중지해야하며 (b) 최소화 된 경우에만 초점을 맞출 때 플래시해야합니다. – Joey

0

초점을 잘 맞추어 확인해야하므로 항상 false를 반환하는 이유를 알아야합니다.

어떤 이벤트를 듣는 지, 아마도 GotFocus 이벤트인데, Focused 속성에 문제가있을 때까지 작동하지 않을 수도 있습니다.

0

처리 방법에는 여러 가지가 있습니다. 아마도 가장 쉬운 방법은 양식이 깜박일 때마다 플래그를 설정하여 양식의 다시 활성화시 재설정 할 수 있습니다. 기본 IM 창 양식

코드

private bool IsFlashing; 
.... 

// Code for IM windows 
public void OnActivate(EventArgs e) 
{ 
    if (IsFlashing) 
    { 
     // stop flash 
     IsFlashing = false; 
    } 
} 

public void Flash() 
{ 
    // make flash 
    IsFlashing = true; 
} 

그럼 당신은 당신이 (당신은 여러 사람을 처리 할 경우) 그 특정 대화 창 것을 확인해야 만 할 새 메시지를 처리하는 코드를 할 때마다 메시지가 현재 활성 상태 인 경우

public void OnNewMessage(AMessage msg) 
{ 
    Form convoWindow = FindConvoWindow(msg.Sender); 
    if (Form.ActiveForm == convoWindow) 
    { 
     // update the conversation text 
    } 
    else 
    { 
     convoWindow.Flash(); 
    } 
} 
관련 문제