2013-04-02 29 views
0

有沒有辦法爲WinForms應用程序的所有控件禁用鼠標懸停效果?我知道你可以通過遍歷所有控件來實現,但我寧願在應用程序級別上進行。爲應用程序禁用鼠標懸停效果

背景是,我想禁用整個應用程序的輸入(我通過IMessageFilter)。用戶仍然應該能夠移動鼠標,但無法點擊它。這工作得很好,但控制懸停效果仍然存在。


編輯:

例如,如果你將鼠標移到按鈕,則表明您可以點擊一次鼠標是否在該控件

應用程序由多個可能的開放表單,每個表單都可以啓動一個後臺工作器(線程),從中我需要控制應用程序的行爲。所以我真的很喜歡避免弄亂GUI線程問題。

+0

「懸停效果「? –

+0

我認爲,該鏈接將幫助你> http://stackoverflow.com/questions/2698673/disabling-mouse-movement-and-clicks-altogether-in-c-sharp – zey

+0

@zey我已經做了禁用鼠標點擊和IMessageFilter的鍵盤輸入,我只想擺脫「懸停」效果 – derape

回答

0

在我看來,你只是想禁用頂層窗口。這將解決您的所有問題,並消除您的代碼需求。你最終只有一小部分代碼。

您需要的P/Invoke從USER32的EnableWindow API調用:

[DllImport("user32.dll")] 
static extern bool EnableWindow(IntPtr hWnd, bool bEnable); 

然後你可以控制你的表格是這樣的可用性:你說的意思是什麼

EnableWindow(MyForm.Handle, false); // disable form 
EnableWindow(MyForm.Handle, true); // enable form 
+0

謝謝,我也玩過這一點,但問題是我的應用程序處理多個表單,並且還需要多個線程來從中禁用。所以我需要跟蹤所有的表單,並且做一個'Invoke'來獲取所有的表單句柄,這種類型的表現讓我感到害怕。如果可能,我不想進入GUI線程問題 – derape

+0

這些問題與此不同。由於您需要應用廣泛的應用程序,無論如何您都需要處理這些問題。 –

+0

至於鼠標/鍵盤禁用,我不必(至少不是從開發人員的角度來看)。我只需要將'IMessageFilter'實現的實例添加到我的應用程序消息過濾器Application.AddMessageFilter()中。我希望有一個像這樣的解決方案的「懸停」效果......不知何故操縱光標或... – derape

0

你可以開始創建自己的按鈕類,並覆蓋MouseEnter事件:

protected override void OnMouseEnter(EventArgs e) 
{ 
    if (shouldBeEnabled) 
    { 
     base.OnMouseEnter(e); 
    } 
} 
+0

我不希望那些按鈕,但對於所有能夠處理鼠標事件的控件 – derape

+0

好。我認爲你不想自己創建所有的類,所以這裏是最簡單的方法。在窗體的OnLoad方法上,遍歷所有子控件,並刪除OnMouseEnter事件並添加自定義事件。這或重寫該處理程序爲您使用的所有UI控件。 – Marco

+0

那麼,這是一個好主意,但希望在應用程序的運行時期間按需禁用並啓用它... – derape