我正在嘗試爲我在C#中編寫的應用程序編寫專門的屏幕鍵盤(OSK)。爲了實現這一點,我創建了一個表單,其上有幾個表示鍵的按鈕,並單擊它們調用SendKeys
併發送相應的鍵。C# - 可以安全地擁有一個獨立的線程擁有的形式?
此表格由應用程序第一次啓動時顯示的主窗口所有,使用Owner
屬性。這樣,只要用戶關注應用程序,OSK就會彈出,如果主窗口被拖動到主窗口上,OSK就會保持在主窗口的頂部。
這一切都很好,但因爲我有模式對話框,我也想用OSK,我試圖在一個單獨的線程中創建它,並使用它自己的消息循環(通過Application.Run
),所以它仍然可以可用於主線程中的任何模態對話框。
這樣做的問題在於,顯然,由於跨線程調用,在單獨的線程中可能導致InvalidOperationException
。其中一個具體示例是,在從新線程調用Application.Run(osk)
時,會發生交叉線程錯誤,因爲它正嘗試用所有者(主窗口)更新窗口句柄。
我的問題是,是否有可能在一個線程上擁有一個獨立於所有者的安全方式?而且,如果失敗了,是否有可能模仿擁有的表單的特性(即只有主窗口始終處於頂部,並在主窗口關注時彈出)?
謝謝,抱歉,如果這是混亂。
爲什麼要在不同的UI線程中使用模態對話框?看起來如果有多個UI線程,每個線程應該有它自己的OSK。我不明白你爲什麼需要啓動其他線程。 – YWE 2010-09-26 03:23:30
我創建的唯一獨立線程是OSK中的線程,因此它可以用於需要文本輸入的模式對話框。其他一切都在原始主線程上。 – mgbowen 2010-09-26 03:25:14
好的,這是有道理的。 – YWE 2010-09-26 03:35:58