我正在C#中使用WinForms在具有多種表單的大型應用程序中工作。檢測我的表單是否有焦點
在幾點我有另一種形式來作爲進展屏幕。因爲我無法凍結我的UI線程,所以我必須在新線程中啓動新窗體。我使用progressform.ShowDialog()
來啓動表單,但由於它在新線程中,因此可以點擊或返回主表單。我想禁用這個。
我的想法是,我可以在mainForm.GotFocus
事件上放置一個EventHandler,並將焦點重定向到progressForm
(如果顯示)。但是,當您切換應用程序或在progressForm
和mainForm
之間移動時,GotFocus
事件未被觸發。我猜測這是因爲mainForm
中的某個元素具有焦點,而不是表單本身。
如果有人知道更好的方法來做到這一點(我沒有致力於EventHandler方法)或EventHandler方法的工作代碼,它會解決我的問題。
編輯
按評論,我嘗試使用Activated
事件。
// in InitializeForm()
this.Activated += FocusHandler;
// outside of InitializeForm()
void FocusHandler(object sender, EventArgs e)
{
if (ProgressForm != null)
{
ProgressForm.Focus();
}
}
但它仍然允許我回到主窗體並單擊按鈕。
使用兩個UI線程是各種各樣問題的祕訣。不要這樣做。 – SLaks
不幸的是,我在項目結束時進來幫助完成它。雙UI線程現在已經在系統中紮根。把它拿出來會比它的價值更麻煩。 – Chris
您是否嘗試過[Form.Activate](http://msdn.microsoft.com/zh-cn/library/system.windows.forms.form.activate.aspx)方法和[Form.Activated](http:///msdn.microsoft.com/en-us/library/system.windows.forms.form.activated.aspx)事件? – Steve