2010-07-29 2 views
0

사용자가 볼 수 있도록 모든 창 앞에 팝업 메시지 상자를 표시하려고합니다. 나는 다음과 같은 코드를 가지고 있지만 메시지 상자를 맨 뒤에 놓은 것 같습니다.콘솔 응용 프로그램의 모든 창 앞에 메시지 상자가 있습니까?

DialogResult dlgResult = MessageBox.Show(new Form() { TopMost = true }, "Do you want to continue?", "Continue?", 
      MessageBoxButtons.YesNo, MessageBoxIcon.Question); 
     if (dlgResult == DialogResult.Yes) 
     { 
      Console.WriteLine("YES"); 
     } 
     else if (dlgResult == DialogResult.No) 
     { 
      Console.WriteLine("NO"); 
     } 

위의 코드는 스레드에서 실행됩니다. 내 문제는 무엇이며 어떻게 수정합니까?

감사합니다.

+1

[한숨]하지 마십시오 :

[DllImport("coredll.dll", SetLastError=true)] public static extern int MessageBoxW(int hWnd, String text, String caption, uint type); 

은 다음과 같이했다. 중요한 메시지 상자가 중요 할 수도 있으므로 사용자가 결정한 내용이 현재로서는 가장 중요한 앱입니다. 게다가 사용자가 예를 들어 이메일을 입력하고 메시지 상자가 튀어 나와 키보드 포커스를 훔친다면 나중에 50 %의 확률로 사용자가 후회할 수 있습니다. –

+0

이것이 핵심입니다. 사용자는 다른 응용 프로그램에서 팝업 메시지를 호출 할 때 팝업 메시지가 표시됩니다. 어쨌든 조언을 주셔서 감사합니다. – arbme

+0

메시지 상자를 맨 위에 밀어 넣고 키보드 포커스를 훔치는 대신 FlashWindowEx (http://msdn.microsoft.com/en-us/library/ms679347(VS.85).aspx)를 사용하십시오. –

답변

3

최선의 선택이 같은 상황에서이 P를 사용하는 아마/호출은 MessageBox를 호출 직접 기능. 그런 다음 MB_TOPMOST 플래그를 포함하면 최상위 메시지 상자가됩니다. (.이 관리 API에 노출되지 않습니다)

이것은 (pinvoke.net에서)로 선언된다 :

MessageBoxW(0, "Topmost Window", "Hello world", 0x00000040L /*MB_ICONINFORMATION*/ | 0x00040000L /*MB_TOPMOST*/); 
3

네 문제입니다. 당신이 만드는 양식은 doornail로서 죽을 것이고, 당신의 스레드는 메시지 루프를 펌핑하지 않을 것입니다. 비록 당신이 그것을 일하게 만들 수 있다고하더라도, 당신은 여전히 ​​중대한 문제를 가지고있을 것입니다. 사용자의 얼굴에서 메시지 상자를 누르는 것은 안정적으로 작동하지 않습니다. 사용자는 Word 문서를 두드려서 스페이스 바를 누르면 메시지 상자가 팝업됩니다. 바로 사라지려면. 사용자가 알게되는 모든 것은 약간의 플래시와 신비하게도 문서에서 누락 된 공간입니다.

정말 NotifyIcon을 사용하여 이와 같은 알림을 팝업해야합니다. ShowBalloonTip 메서드는 백그라운드 정보를 전달하는 표준 방법입니다.

사용자 정의 무언가를 보여주기 위해 고유 한 Form 클래스를 만들 수 있습니다. 위에서 언급 한 플래시 - 앤 - 간 문제를 피하기 위해 초점을 훔치지 않는 것이 중요합니다. 메시지 루프 문제를 피하기 위해 전용 스레드를 만들어야합니다. 이런 식으로 뭔가 :

public static void ShowNotification(string msg) { 
     var t = new Thread(() => { 
      var frm = new frmNotify(msg); 
      frm.TopMost = true; 
      var rc = Screen.PrimaryScreen.WorkingArea; 
      frm.StartPosition = FormStartPosition.Manual; 
      frm.CreateControl(); 
      frm.Location = new Point(rc.Right - frm.Width, rc.Bottom - frm.Height); 
      Application.Run(frm); 
     }); 
     t.SetApartmentState(ApartmentState.STA); 
     t.IsBackground = true; 
     t.Start(); 
    } 

frmNotify가 통지 형태이며,이 같은 :

public partial class frmNotify : Form { 
    public frmNotify(string msg) { 
     InitializeComponent(); 
     frm.TopMost = true; 
     label1.Text = msg; 
     this.ShowWithoutActivation = true; 
    } 
} 
관련 문제