2014-12-03 81 views
1

我的C#應用​​程序中包含一個「篩選」項目的「幫助」菜單。這個項目顯示一個默認的MessageBox和一個解釋,按鈕是OK和幫助,它在MSDN中打開一個鏈接。通過F1快捷鍵打開多次C#消息框鏈接

string link = "http:..."; 
MessageBox.Show("explanation...", "Filtering", MessageBoxButtons.OK, 
    MessageBoxIcon.Information, MessageBoxDefaultButton.Button1, 0, link); 

通過項目打開消息並通過「幫助」按鈕打開鏈接即可。

問題:
我添加了「過濾」(F1)的快捷鍵。現在當我在應用程序中按F1時,不僅打開消息框和鏈接,它會打開鏈接2或3次。
行爲是這樣的:

  • 點擊該項目仍然正常工作。
  • 第一次打開應用程序時按F1鍵 - 鏈接會自動打開3次(同一頁的3個選項卡)。
  • 下次按F1(關閉消息框後) - 鏈接會自動打開2次。

問題是關於使用F1,因爲它也是盒子中幫助按鈕的關鍵,但它仍然不能解釋爲什麼在剛剛打開的盒子中出現關鍵事件,以及爲什麼鏈接打開2或3次。我檢查了:

  • 消息框打開一次。
  • 創建並打開消息框的代碼運行一次 - 當我按下F1時。
  • 將快捷鍵更改爲F10或其他內容可以防止出現問題,但我想使用F1作爲標準幫助快捷方式。

任何人都可以想出一種方法來解決這個問題嗎?即使鏈接只打開一次,我也沒有問題。

+1

打開請顯示你的F1事件的處理程序代碼。現在你讓我們猜測這個問題。但是,確保在處理事件後取消事件以防止它冒泡到其他處理程序。 – 2014-12-03 14:05:13

+0

@PaulSasik'this.FilteringToolStripMenuItem.ShortcutKeys = System.Windows.Forms.Keys.F1;'併發送到我發佈的代碼的點擊處理程序。 – 2014-12-03 14:10:54

+0

重要事件的事件處理程序會長時間觸發多次,這取決於您在Windows中的驅動程序和鍵盤設置,但是如果您持續「f」一段時間,則會出現「fffffffffffffffff」。這與F1鍵是一樣的。 修復問題的最簡單方法是在MessageBox關閉之前使事件處理程序「阻止」程序執行。其次是扼制F1事件處理程序方法(通過將上次執行的時間存儲在類級別變量中,防止它每秒被調用一次以上) – 2014-12-03 14:46:39

回答

1

試試這個:

private bool isClicked = false, secondTime = false; 

private void FilteringToolStripMenuItem_Click(object sender, EventArgs e) 
{  
    isClicked = true; 
    string link = "http:..."; 
    MessageBox.Show("explanation...", "Filtering", MessageBoxButtons.OK, 
    MessageBoxIcon.Information, MessageBoxDefaultButton.Button1, 0, link); 
    isClicked = false; 
} 

private void ShowMsgBox() 
{ 
    secondTime = true; 
    string link = "http:..."; 
    MessageBox.Show("explanation...", "Filtering", MessageBoxButtons.OK, 
    MessageBoxIcon.Information, MessageBoxDefaultButton.Button1, 0, link); 
    secondTime = false; 
} 

protected override void WndProc(ref Message m) 
{ 
    if (m.Msg == 0x53) //WM_HELP message 
    { 
     if (isClicked == false) 
     { 
      if (secondTime == false) 
      { 
       ShowMsgBox(); 
      } 
     } 
    } 

    base.WndProc(ref m); 
} 

刪除行:

this.FilteringToolStripMenuItem.ShortcutKeys = System.Windows.Forms.Keys.F1; 

當您按下F1鍵,FilteringToolStripMenuItem_Click被調用時,鏈接被打開,則產生WM_HELP消息,另一個鏈接被打開。與上面的代碼中,我們檢查是否當打開沒有消息框生成WM_HELP消息(secondTime =假和isClicked =假),並且當一個消息框是通過ToolStripMenuItem(isClicked =真)

+0

Thnx。我想祕密就是孤立事件,它的工作。 – 2014-12-04 11:42:43