Winforms 如何防止控件窃取焦点?

Winforms 如何防止控件窃取焦点?,winforms,winapi,focus,Winforms,Winapi,Focus,我们在C#WinForms应用程序中加载了一个第三方控件 当我们在这个第三方ActiveX控件上调用一个方法时,它会异步窃取焦点。例如: // This call causes 3rd party to spawn a thread and steal focus // milliseconds later. foo3rdParty.DoSomething(); 有没有办法防止控件窃取焦点?您可以尝试以下粗略方法: 在进行调用之前,请先找到具有焦点的控件,例如使用Form.ActiveCon

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

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

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

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

您可以尝试以下粗略方法:

  • 在进行调用之前,请先找到具有焦点的控件,例如使用
    Form.ActiveControl
  • 将处理程序附加到活动控件,该控件在失去焦点时被调用
  • 调用第三方控件的方法
  • 如果一切按预期进行,则第三方控件将获得焦点,而先前聚焦的控件将失去焦点,并且将调用处理程序
  • 在该处理程序中,要么将焦点设置回上一个控件,要么安排一些代码在线程上运行,以便稍后执行

  • 如果控件有一个GotFocus()事件(并且每当它窃取焦点时,控件都会正确地引发该事件),则可以向该事件附加一个处理程序,并将焦点设置回具有焦点的最后一个控件(或“确定”按钮或其他什么)


    <>这可能会有怪异之处,如果有人在这个文本框中键入。我的解决办法是把我的钱给一个愿意做15分钟工作来帮助我的人。

    如果这个邪恶的小控件不应该是可见的,你可以把它放在一个不可见的窗体上,并在上面调用DoSomething()。那么,谁在乎它是否能抓住焦点呢。您可能已经想到了这一点,但您能否在控件尝试对焦期间(或猜测期间)禁用该控件的窗口,而不影响用户体验?

    您可能必须执行消息钩子来拦截并取消对焦更改。这是一种非常粗鲁的控制行为——我想不可能完全移除它。不是开玩笑,这真的是粗鲁的行为。我们问开发人员如何防止/解决这种行为,他告诉我们,“使用Win32 API收回焦点。”问题是,没有关于线程何时完成窃取焦点的通知,所以我们有点担心。我们向开发人员解释了这一点,但从未收到回复。他是否解释了为什么他的控件首先需要窃取焦点?如果有任何合理的理由的话,它可能是一个黑客修复,掩盖了一个更深层次的问题。我希望这不是航天飞机生命维持控制系统,不是“他”。这是一家“他们”——一家非常非常大的公司,其第三方控制权遍布“网络”。)他们认为他们的控制非常重要,所以当你调用DoSomething()时,它应该占据焦点。是的,非常粗糙。我试过了,发现控件本身在这段时间内窃取了焦点2-3次,所以即使是这种破解也不能完全奏效。谢谢,试过了。事实证明,这个第三方activex控件在调用DoSomething()后多次窃取焦点,通常是2到3次。这使您的上述黑客解决方案复杂化。不管怎样,还是谢谢你。我会试试看,然后再打给你。我已经试过了,而且似乎有效。诚然,这是一个黑客,但不太难看,工作相当一致。谢谢你的建议,我将此标记为已接受的答案。你是如何做到这一点的,因为这正是我面临的问题。恐怕这必须在我们的表格上。啊。