在什么情况下,焦点位置可以与插入位置不同?

时间:2015-09-18 07:50:25

标签: c#

我正在制作带有文本框的C#windows窗体应用程序。该程序需要非常准确的知识何时激活其表单以及哪个文本框具有输入焦点。但是我发现插入符号在我的表单中的文本框中闪烁但同时在窗口后面的桌面上选择了一个图标。因此,如果我按回车键,桌面上的所选图标将被打开,而不是在我的文本框上给我一个新行。单击文本框上的鼠标将解决问题并真正关注文本框,以便我可以与它进行交互。

当我打开互联网浏览器窗口并且我的应用程序通过互联网浏览器窗口打开表单时,似乎最常发生这种情况。

我需要知道什么情况会导致这种情况。它可能是由某个设置的表单的TopMost属性引起的吗?还是WindowState?这很难复制,因此我无法通过消除更改设置的过程找到答案。有人有什么想法吗?

感谢。

1 个答案:

答案 0 :(得分:2)

即使特定文本框可能被聚焦(在窗口的上下文中),也无法保证您的窗口在打开后会成为焦点和前景窗口。

为了检测你的窗口是否集中在操作系统的上下文中,你仍然坚持使用旧的win32 API调用。 Form.ActiveForm或任何其他属性是特定于应用程序的(并且不会告诉您程序是否是操作系统的前景)

//Check current foreground window
[System.Runtime.InteropServices.DllImport( "user32.dll" )]    
public static extern IntPtr GetForegroundWindow();

//Set current foreground window
[System.Runtime.InteropServices.DllImport("user32.dll")]
public static extern bool SetForegroundWindow(IntPtr hWnd);

如何使用这些来强制执行焦点的示例:

if(GetForegroundWindow() != yourForm.Handle)
{
    SetForegroundWindow(yourForm.Handle);
}

在您知道应用程序是操作系统的前台窗口后,control.Focused应该可以确定窗口中的哪个控件具有焦点。

编辑:我只是想补充一点,即使您的窗口是TopMost,也不意味着它会保留操作系统焦点。它只是意味着它将呈现在没有设置此属性的其他窗口之上。