2014-02-19 36 views
0

我想禁用激活的Form。要做到這一點我用這樣的:啓用/禁用表單激活

private const int WS_EX_NOACTIVATE = 0x08000000; 
protected override CreateParams CreateParams 
{ 
    get 
     { 
      CreateParams createParams = base.CreateParams; 
      createParams.ExStyle = WS_EX_NOACTIVATE; 
      return createParams; 
     } 
} 

這是罰款,我的計劃的主要活動,因爲我仍然可以點擊按鈕和Form不會激活。無論前臺的節目是在哪裏。

的問題是在我的節目開始,我需要輸入一些文字用鍵盤和該Form必須是活動的,否則文本會去程序在前臺。

我知道何時何地想要啓用/禁用Form的能力被激活,我只是不知道如何。

編輯:而當它不能活躍了,我仍然希望窗體的按鈕可點擊。這裏的代碼就是這樣的。真正的問題在於我想輸入一些文本的開始。

回答

0

即使搜索周圍的上網本更後我發現了一個簡單的在線解決方案:

Activate();

不知道這一點的存在。使用問題中的代碼加上上的代碼,我可以讓程序在開始時處於活動狀態,並保持這種狀態,直到我切換到另一個程序。之後,我的程序將永遠不會再活動。 除非我把一個按鈕或者一些再次調用Activate()的東西。

+0

它不工作'( –

1

Windows不支持NoActivate標誌。您可能有更好的運氣拒絕點擊消息。

private const int WM_MOUSEACTIVATE = 0x0021, MA_NOACTIVATE = 0x0003; 

protected override void WndProc(ref Message m) { 
    if (m.Msg == WM_MOUSEACTIVATE) { 
    m.Result = (IntPtr)MA_NOACTIVATE; 
    return; 
    } 
    base.WndProc(ref m); 
} 

這將讓點擊進入下一個窗口。如果你想完全阻止點擊,使用MA_NOACTIVATEANDEAT = 0x0004代替MA_NOACTIVATE

如果你不需要這麼強大的保護,還有另外一個標誌可以覆蓋:

protected override bool ShowWithoutActivation 
{ 
     get { return true; } 
} 
+0

這是行不通的。如果你點擊一個按鈕或其他的東西,程序仍然會被激活。 使用MA_NOACTIVATEANDEAT,點擊不起作用。他們需要一直工作。 –

+0

對不起,也許我不明白。你想防止點擊激活表單,或者你想阻止其他事件嗎? –

+0

我想阻止任何東西激活表單,但有兩個捕獲點: 1 - 我仍然希望能夠單擊表單的按鈕而不激活它。我可以用我目前使用的代碼,即我在問題中發佈的代碼來實現。但有一個小問題:編號爲2. 2 - 在程序開始時,我想在TextBox中用鍵盤輸入一些文本,並且表單必須處於活動狀態。否則,文本將轉到當時前臺的任何程序。之後,它不再需要活動了。 –