2009-12-22 53 views
1

我想在標題欄上的右鍵菜單右鍵單擊如何處理表單標題右鍵單擊

c#中的任何提示/示例前綴?

更新 - 由於種種原因,右鍵單擊窗體上不會起作用,因爲形式是不是空的,形式合成動態等等....

+2

右鍵單擊窗體或窗體的標題? – gbianchi 2009-12-22 17:46:02

+0

沒有鼠標點擊標題,據我所知,你必須掛鉤到win32來處理非客戶區事件,這是我在年齡未做過的事情... – Kumar 2009-12-22 18:08:13

回答

9

您可以通過捕獲Windows在用戶右鍵單擊標題欄時發送的WM_NCRBUTTONDOWN通知來執行此操作。控件類沒有它的事件,你需要重寫WndProc()。下面是一個示例表單,您需要添加一個ContextMenuStrip:

public partial class Form1 : Form { 
    public Form1() { 
     InitializeComponent(); 
    } 

    protected void OnTitlebarClick(Point pos) { 
     contextMenuStrip1.Show(pos); 
    } 

    protected override void WndProc(ref Message m) { 
     const int WM_NCRBUTTONDOWN = 0xa4; 
     if (m.Msg == WM_NCRBUTTONDOWN) { 
      var pos = new Point(m.LParam.ToInt32()); 
      OnTitlebarClick(pos); 
      return; 
     }           
     base.WndProc(ref m); 
    } 
} 
0

MSDN explains如何處理Windows窗體上右鍵單擊控制。包括表單在內的控件繼承了MouseClick事件。

MouseEventArgs會告訴你什麼按鈕被點擊通過Button屬性。看看MouseButtons枚舉。

+0

更新了問題 – Kumar 2009-12-22 18:02:46

+0

我看到。不幸的是,沒有MousePreview就像有一個KeyPreview,所以我不知道如何解決這個問題。 – 2009-12-22 18:17:03

0

如果處理表單鼠標點擊,您就可以使用下面的代碼:

private void Dialog_MouseClick(object sender, MouseEventArgs e) 
    { 
     if (e.Button == MouseButtons.Right) 
     {         
      this.Text = "new caption text"; 
     } 
    } 

但你必須確保你在窗體上生成此事件的最高級別控制。例如,如果您在窗體上有一個組框,它將接收鼠標單擊事件而不是窗體本身,用於組框下的窗體區域。

0

當您右鍵單擊標題欄時,已經有一個由Windows管理的菜單。

你想完全替換它嗎?

如果你想添加到它,你將不得不使用Win32 API和互操作,你將不得不繼承該表單。

請參閱AppendMenu()函數。

0

基本上你需要使用p-invoke來做到這一點。 Here 有一個非常好的例子,你可以從例子中看到你需要手動模擬事件處理程序,但這非常簡單。

0

您可以覆蓋形式的WndProc和捕捉WM_NCRBUTTONDOWN消息:

protected override void WndProc(ref Message m) 
    { 
     const int WM_NCRBUTTONDOWN = 0xA4; 

     if (m.Msg == WM_NCRBUTTONDOWN) 
     { 
      MessageBox.Show("Caption right clicked!"); 
     } 
     else 
     { 
      base.WndProc(ref m); 
     } 
    } 

此代碼將打壓窗口的上下文菜單,但是。你可能不希望這樣。如果右擊窗口邊框,WM_NCRBUTTONDOWN消息也會被髮送。你也可能不想要這個。