C#:窗体Topmost与获取输入焦点

仅设置 `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();

}

}

```

注意:

  1. Windows 安全机制限制后台进程随意抢占焦点。如果调用失败,通常是因为当前前台进程未授权。

  2. 若需持续保持焦点(如锁屏软件),需配合 `Timer` 周期性调用 `SetForegroundWindow` 并检查 `GetForegroundWindow()` 是否为本窗口句柄 。

  3. `TopMost` 仅控制 Z-order(显示层级),`SetForegroundWindow` 控制输入焦点,两者需配合使用 。

相关推荐
淡海水1 小时前
05-02-源码-Boehm GC标记阶段
算法·unity·c#·游戏引擎·gc
信可维1 小时前
AI 读 Word 表格总读错?先查合并单元格和表头这 3 处
开发语言·人工智能·c#·word·软件工程
半摆烂日常3 小时前
手机表单的左滑操作:触摸事件的处理细节
大数据·开发语言·人工智能·智能手机·https·c#
绛橘色的日落(。・∀・)ノ4 小时前
C#学习笔记
笔记·学习·c#
asdzx674 小时前
C# 将 HTML 转换为 PDF:基于 Chrome 的转换方案
pdf·c#·html
1-1=05 小时前
.NET 实现后台任务
c#·.net·.netcore·quartz·hangfire
步步为营DotNet5 小时前
从分代预算到 DATAS:.NET GC 调优到底在调什么
c#·.net·内存管理·gc·datas
淡海水5 小时前
05-03-源码-Boehm GC分配与碎片管理
开发语言·算法·unity·c#·游戏引擎·gc
曹牧5 小时前
C#:字符串占位符与值数量不一致
开发语言·数据库·c#
玩泥巴的1 天前
MAF + 飞书:让大模型干活,但别让它乱干
ai·c#·.net·飞书·agent