如何防止控制窃取焦点?

时间:2009-07-13 22:02:19

标签: winforms winapi focus

我们在C#WinForms应用程序中加载了第三方控件。

当我们在第三方ActiveX控件上调用方法时,它会异步窃取焦点。例如:

// This call causes 3rd party to spawn a thread and steal focus 
// milliseconds later.
foo3rdParty.DoSomething();

有没有办法阻止控件窃取焦点?

4 个答案:

答案 0 :(得分:3)

如果控件有一个GotFocus()事件(控件在每次窃取焦点时都正确引发),你可以附加一个处理程序并将焦点设置回最后一个具有焦点的控件(或者确定按钮或其他)。

如果有人在中间输入文本框,这可能会产生奇怪。我的解决方案是把钱交给愿意做15分钟工作来帮助我的人。

答案 1 :(得分:3)

如果这个邪恶的小控件不是可见的,你可以把它放在一个看不见的形式上并在那里调用DoSomething()。然后,谁在乎它是否抓住焦点?

答案 2 :(得分:2)

您可以尝试这种粗略的方法:

  1. 在拨打电话前查找哪个控件具有焦点,例如使用Form.ActiveControl
  2. 将处理程序附加到活动控件,当它失去焦点时会调用它。
  3. 调用第三方控件的方法。
  4. 如果一切按预期进行,第三方控件将获得焦点,之前关注的控件将失去焦点,并且将调用处理程序。
  5. 在该处理程序中,将焦点设置回上一个控件,或者安排一些代码在线程上运行,以便稍后执行此操作。

答案 3 :(得分:2)

啊。您可能已经考虑过这个问题,但是当它试图获得焦点时,您是否可以在期间(或猜测)禁用控件的窗口,而不会损害用户体验?