2010-09-17 85 views
3

我有一個問題,用於模擬的MessageBox。問題與消息框

這裏的情況是,

  • 從形式提供給用戶選擇XX
  • 消息框出現
  • 用戶打開embebed軟件鍵盤(內置於一體,從設備)
  • 用戶關閉鍵盤
  • MessageBox失去焦點(怎麼樣,它被認爲是模態!),主窗體顯示在前臺
  • 應用程序塊,因爲用戶現在不能關閉MessageBox。

這是MessageBox的代碼片段。

MessageBox.Show("message", "caption", MessageBoxButtons.OK, MessageBoxIcon.Asterisk, 
            MessageBoxDefaultButton.Button1); 

有關如何解決這個問題的任何想法?

+0

還有其他有趣的因素嗎?看起來你應該「只是工作」。如果你創建一個新窗體並在這個新窗體上執行'ShowModal()',會發生什麼?你會看到相同的行爲嗎? – Nate 2010-09-17 18:59:26

回答

0

在調用MessageBox.Show(IWin32Window參數,通常只傳入「this」)時,需要包含對父窗體的引用。我相信這是你想要使用的過載 - 見下:

MessageBox.Show Method (IWin32Window, String, String, MessageBoxButtons, MessageBoxIcon, MessageBoxDefaultButton) 

Here is a link to the Microsoft documentation.

享受!

+0

不幸的是,緊湊的框架不支持這個 – MerickOWA 2010-09-17 19:21:58

+2

不 - 不支持 - CF不支持這一點,即使它沒有解決問題(請參閱我的答案) – ctacke 2010-09-17 21:39:25

1

這實際上是在Windows CE下有些預期的行爲(我不是說它是正確的,只是預期)。

當您單擊桌面角落的SIP按鈕時,整個應用程序失去焦點並將焦點傳遞給任務欄。您可以通過點擊應用程序的任務欄按鈕來看到類似的「奇怪」 - 即使您應該只將焦點發送給已運行的應用程序,但MessageBox將失去焦點。

你可以看到,它不是一個CF錯誤改變你的觀察MessageBox的調用就像這樣:

private void button1_Click(object sender, EventArgs e) 
{ 
    //MessageBox.Show("message", "caption", MessageBoxButtons.OK, 
    //         MessageBoxIcon.Asterisk, 
    //         MessageBoxDefaultButton.Button1); 

    MessageBoxCE(this.Handle, "message", "caption", 0); 
} 

// renamed to not collide with the Windows.Forms MessageBox class 
[DllImport("coredll", EntryPoint="MessageBox")] 
private static extern int MessageBoxCE(IntPtr hWnd, string lpText, 
             string lpCaption, int Type); 

,你會得到完全相同的行爲。

有一件事是而不是預計是父窗體在MessageBox上方。我剛剛在我桌面上的基於ARM的CE 5.0設備上進行了測試,並且MessageBox在CF和P/Invoke版本中都保持最佳狀態。

您是否可以用一個非常基本的應用程序(即只有一個窗體,一個按鈕)重現此行爲?如果是這樣,那聽起來像是一個平臺問題。關於使用CE的一點要記住的是,由於OEM對操作系統的實際操作有很大的控制權,所以你絕不能排除行爲的平臺錯誤。

0
MessageBox.Show("Please insert Correct Username and Password.", "Login Error", 
       MessageBoxButtons.OK, MessageBoxIcon.Exclamation); 
this.Focus(); 

它是一個簡單的解決方案。無需運行任何JavaScript或其他C#代碼。