仅设置 `TopMost = true` 无法保证窗体获取键盘输入焦点。需结合 Windows API `SetForegroundWindow` 强制激活窗口。
```csharp
using System;
using System.Runtime.InteropServices;
using System.Windows.Forms;
public partial class Form1 : Form
{
// 导入用户32库API
DllImport("user32.dll")
private static extern bool SetForegroundWindow(IntPtr hWnd);
DllImport("user32.dll")
private static extern IntPtr GetForegroundWindow();
public Form1()
{
InitializeComponent();
this.TopMost = true; // 设置置顶属性
}
/// <summary>
/// 调用此方法使窗体置顶并获取焦点
/// </summary>
public void ForceFocus()
{
// 如果窗口是最小化状态,需要先恢复
if (this.WindowState == FormWindowState.Minimized)
{
this.WindowState = FormWindowState.Normal;
}
// 尝试获取焦点
SetForegroundWindow(this.Handle);
// 可选:确保内部控件也获得焦点(如TextBox)
// this.ActiveControl?.Focus();
}
private void btnShow_Click(object sender, EventArgs e)
{
ForceFocus();
}
}
```
注意:
-
Windows 安全机制限制后台进程随意抢占焦点。如果调用失败,通常是因为当前前台进程未授权。
-
若需持续保持焦点(如锁屏软件),需配合 `Timer` 周期性调用 `SetForegroundWindow` 并检查 `GetForegroundWindow()` 是否为本窗口句柄 。
-
`TopMost` 仅控制 Z-order(显示层级),`SetForegroundWindow` 控制输入焦点,两者需配合使用 。