2011-08-04 35 views
7

我在C#中使用Windows窗體。同時激活表單和進程按鈕點擊?

我有一個包含toolStripButtons的幾個工具欄的主窗體。在處理包含數據的另一個表單後,主表單失去焦點並單擊ToolStripButton不會觸發OnClick事件:第一次單擊會激活主窗體,只有第二次單擊會實際按下按鈕。我需要用戶只點擊一次按鈕觸發一個Click事件,關於如何做到這一點的任何想法?謝謝。

注:

  • 我用MDI,有沒有問題,點擊父母的表單按鈕。但現在最重要的是讓表單自由地跨越多個顯示器。
  • 工作人員表單具有作爲所有者屬性的主窗體,這樣他們就停留在主窗體的頂部。
  • 當我點擊一個不活動窗體的按鈕時,MouseHover,MouseEnter,MouseDown和MouseUp都不會觸發。這只是主窗體的激活事件觸發。
  • 在主表單上有一個treeView(位於面板內的一個tabContainer內的tabControl內)。它的項目在第一次鼠標點擊時被選中,即使主窗體不活動。我想不是所有的控件都是平等的!

回答

6

您需要做的是創建一個繼承ToolStrip並處理WndProc的類。這是做到這一點的一種方法。還有其他人。

private class MyToolStrip : ToolStrip 
{ 
    private const uint WM_LBUTTONDOWN = 0x201; 
    private const uint WM_LBUTTONUP = 0x202; 

    private static bool down = false; 

    protected override void WndProc(ref Message m) 
    { 
     if (m.Msg == WM_LBUTTONUP && !down) 
     { 
      m.Msg = (int)WM_LBUTTONDOWN; 
      base.WndProc(ref m); 
      m.Msg = (int)WM_LBUTTONUP; 
     } 

     if (m.Msg == WM_LBUTTONDOWN) down = true; 
     if (m.Msg == WM_LBUTTONUP) down = false; 
     base.WndProc(ref m); 
    } 
} 

我也看到了這個解決方案:

protected override void WndProc(ref Message m) 
{ 
    // WM_MOUSEACTIVATE = 0x21 
    if (m.Msg == WM_MOUSEACTIVATE && this.CanFocus && !this.Focused) 
     this.Focus(); 
    base.WndProc(ref m); 
} 

我就遇到了這個最後我工作的地方,我想我想出了一個解決方案工作更喜歡後者,但我不無法訪問我使用的確切代碼。

+2

建我使用的第二個解決方案,它的偉大工程。謝謝! –

+0

只需注意,它應該是base.WndProc(ref m); –

+0

對不起,我自動從VB轉換了一個。我會解決它。 – dwidel

-4

如果u有表無國界,所以這個邏輯將努力爲您:)

form.FormBorderStyle = FormBorderStyle.None 
+4

你的答案似乎與這個問題沒有任何關係。 – LarsTech

相關問題