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` 控制输入焦点,两者需配合使用 。

相关推荐
波力海苔夹心脆6759 小时前
C# 序列化与反序列化详解:System.Text.Json、Newtonsoft.Json、XmlSerializer 用法、特性选项与安全实践
经验分享·后端·c#·json·.net
小羊没烦恼!15 小时前
在Scrum中实施敏捷建模
java·开发语言·windows·算法·c#
Lost of 程序猿16 小时前
建造者模式实战:告别“十参数构造函数“的数据导出任务
后端·设计模式·c#·asp.net
mudtools17 小时前
在.NET现有系统中快速集成飞书任务分配能力
后端·c#·.net
工具派20 小时前
Word文档太大怎么拆分?段落结构与两种拆法的边界实测
开发语言·c#·word
潜龙952721 小时前
需求文档一键变测试用例:手工用例智能生成平台
开发语言·c#
Lost of 程序猿21 小时前
命令模式实战:把“下单后的动作“打包成可执行的任务
后端·设计模式·c#·asp.net·命令模式
淡海水21 小时前
16-01-C#数据结构源码-附录A-术语表
unity·c#·游戏引擎·il2cpp
小羊没烦恼!21 小时前
【译】利用Asp.net MVC处理文件的上传下载
开发语言·缓存·c#·word·powerpoint·.net
波力海苔夹心脆6751 天前
C# 海康威视摄像头二次开发入门:HCNetSDK 登录、实时预览、云台控制、录像与抓图(WinForms 实战)
开发语言·windows·经验分享·tcp/ip·c#