我想编写一个特殊的屏幕键盘(OSK),用于我正在使用C#编写的应用程序。为了实现这一点,我创建了一个窗体,在上面放置了几个按钮表示键,并且单击它们会调用
这个窗体是由在应用程序首次启动时显示的主窗口拥有的,使用
这都很好,但因为我还想将模态对话框与OSK一起使用,所以我尝试在单独的线程中创建它,完全具备自己的消息循环(通过
问题在于,显然,位于单独线程中会导致交叉线程调用引发
我的问题是,是否可能以安全的方式在单独的线程上拥有一个拥有窗体?如果无法实现,是否可能模拟所拥有窗体的特征(即仅对主窗口始终保持在最上方,并在聚焦于主窗口时弹出)?
谢谢,如果这让您感到困惑,我很抱歉。
SendKeys
并发送相应的按键。这个窗体是由在应用程序首次启动时显示的主窗口拥有的,使用
Owner
属性。这样,每当用户聚焦于应用程序时,OSK就会弹出来,并且如果该主窗口被拖到其上方,则OSK保持在其上方。这都很好,但因为我还想将模态对话框与OSK一起使用,所以我尝试在单独的线程中创建它,完全具备自己的消息循环(通过
Application.Run
),以便可以与主线程中的任何模态对话框一起使用。问题在于,显然,位于单独线程中会导致交叉线程调用引发
InvalidOperationException
异常。其中一个具体的例子是从新线程调用Application.Run(osk)
时,会出现跨线程错误,因为它正在尝试使用所有者(即主窗口)更新窗口的句柄。我的问题是,是否可能以安全的方式在单独的线程上拥有一个拥有窗体?如果无法实现,是否可能模拟所拥有窗体的特征(即仅对主窗口始终保持在最上方,并在聚焦于主窗口时弹出)?
谢谢,如果这让您感到困惑,我很抱歉。