我試圖在WinForms中創建一個自定義的AutoCompleteTextBox控件。由基本TextBox提供的自動完成僅提供結果(string).StartsWith
而不是(string).Contains
。如何防止窗體在仍然接受鼠標點擊的同時竊取焦點?
我在停靠在單獨的Form
中的ListBox
中顯示自動完成搜索結果。我可以通過使用防止Form
從偷焦點開始:
protected override bool ShowWithoutActivation
{
get { return true; }
}
然後,我可以防止Form
從獲得焦點完全由通過重寫WndProc
方法:
protected override void WndProc(ref Message m)
{
base.WndProc(ref m);
switch (m.Msg)
{
case WM_MOUSEACTIVATE:
m.Result = (IntPtr) MA_NOACTIVATEANDEAT;
break;
default:
break;
}
當我做到這一點, ListBox
中包含的Form
將收到MouseMoved
事件,但不包含MouseClicked
事件。
Chaning MA_NOACTIVATEANDEAT
只是MA_NOACTIVATE
將通過鼠標事件的ListBox
,但隨後會導致對ListBox
的點擊次數從Form
偷焦點ListBox
在於 - 它傳遞給「浮動」 Form
的ListBox
是。
有沒有什麼辦法可以防止「浮動」 Form
從「主」 Form
鋼化的重點,而仍然得到ListBox
內MouseClick
事件?
我想你會簡單地被迫把在列表框中收到點擊後,焦點回到主窗體上...或者你使用鼠標移動事件,以確定哪些列表框項目正在盤旋。 HitTest(IIRC)會給你一個ListBoxItem。 – IAbstract
@lAbstract移回焦點的問題在於,它會導致主窗體在下一次顯示浮動窗體時出現在浮動窗體的前面。然後在浮動窗體上調用BringToFront使其重點 - 再次從主窗體中竊取它。 – Anthony
......啊,理解:所以,如果你能夠監視鼠標從你的主窗體移動,你是否能夠在你的主窗體上獲得'HitTestInfo'?如果你能做到這一點,那麼你實際上可以從浮動形式接收選定的項目......我想。 ;) – IAbstract