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

相关推荐
脉动数据行情12 小时前
C# 实现德指 DAX 期货 WebSocket 实时行情监听
开发语言·websocket·c#
码士集团小青3 小时前
C# 手写向量化能追上 C 吗?
c#
c#上位机5 小时前
tuple_max求数组中的最大值
c#·halcon·机器视觉
xintaiideas9 小时前
.NET 项目的多方式启动指南 [特殊字符]
c#
Z59981784110 小时前
c#软件开发学习笔记--WPF(MVVM框架)
笔记·学习·c#
软件黑马王子12 小时前
19.资源加载模块:主要作用和基本原理
开发语言·前端框架·c#
Am-Chestnuts13 小时前
通义千问任务清单怎么导出Word?用DS随心转保留层级和勾选项
开发语言·c#·word
fujisheng66114 小时前
拆解 FUI Source Generator:从 Bind 声明到强类型绑定与路由
c#
古少侠14 小时前
DeepSeek长回答怎么保存成Word?避免逐段复制和漏内容
c#·word