C语言获取win11新版终端WindowsTerminal窗口句柄

随着Win11的普及,越来越多的人都能发现获取控制台窗口不能再使用以下两种传统方法了:

HWND hwnd = GetConsoleWindow();
HWND hwnd = FindWindowA("ConsoleWindowClass",NULL);

那是因为win11换了新的终端窗口,叫做WindowsTerminal,高端大气,字体看得也舒服。
在这里插入图片描述
(↑如果你想换回旧版控制台主机,可以右键标题栏“Settings”进入设置,按上图操作)

不过这个窗口是真的很难抓,
第一, 不推荐使用GetForegroundWindow,风险太大,容易抓成别的窗口,准确率低;
第二, GetConsoleWindow已经无法获取该窗口;
第三, FindWindow(“ConsoleWindowClass”,NULL)也不能抓新的终端;
第四, 抓类名,用第三方工具获得新终端类名,我这里是CASCADIA_HOSTING_WINDOW_CLASS 。用FindWindow,我这里失败了。。
第五, 我去问ChatGPT(3.5),它的回答是:

在 Windows 11 中,Windows Terminal 可能使用了不同的机制来管理其窗口句柄,可能会导致传统的方法无法准确地获取到正确的窗口句柄。
尝试使用 FindWindow 可能不会成功是因为该函数是基于窗口类名或窗口标题来查找窗口的,而 Windows Terminal 可能没有传统的类名或标题。
另一个选择是尝试使用 Windows 11 的新 API,例如 Windows.UI.Xaml 应用程序的 API。你可以考虑使用 Universal Windows Platform (UWP) 或 Windows Runtime (WinRT) API,来与 Windows Terminal 进行交互。
以下是可能用于获取 Windows Terminal 窗口句柄的一种方法,但请注意,这只是一个示例,并不保证可以直接适用于你的情况,而且需要你对 UWP 或 WinRT 有一定的了解:

#include <windows.h>
#include <winrt/Windows.UI.Composition.h>
#include <winrt/Windows.UI.Xaml.Hosting.h>using namespace winrt::Windows::UI::Composition;
using namespace winrt::Windows::UI::Xaml::Hosting;HWND GetWindowsTerminalWindowHandle() {HWND terminalWindowHandle = nullptr;try {// 初始化Windows Runtimewinrt::init_apartment();// 获取Windows Terminal的主机对象auto terminalHost = DesktopWindowXamlSource();// 获取Windows Terminal的根Visual对象auto terminalVisual = ElementCompositionPreview::GetElementVisual(terminalHost);// 获取Windows Terminal的窗口句柄terminalHost.Handle(terminalWindowHandle);} catch (winrt::hresult_error const& ex) {// 处理异常// 可以在这里输出错误信息,调试问题}return terminalWindowHandle;
}int main() {HWND terminalWindow = GetWindowsTerminalWindowHandle();if (terminalWindow != nullptr) {// 在这里使用获取到的窗口句柄进行你需要的操作} else {// 获取窗口句柄失败,处理错误}return 0;
}

请注意,这段代码假设你已经配置好了相应的开发环境,并且能够正确地使用 WinRT 和 UWP API。在使用这些 API 时,你需要适当的访问权限和合适的配置。
记住,由于 Windows Terminal 可能采用了新的技术和 API,因此获取其窗口句柄可能需要更多针对性的方法,并且需要根据具体情况进行调整。

有没有那俩头文件、能不能用是一回事,不过这明摆的是C++(11)啊,我要求是C语言。

于是我的方案是:
第一:FindWindow只抓标题。 没试过,但应该可以,不过标题一定要一字不差。

第二:枚举窗口,如果有窗口对应的PID对应的进程名叫WindowsTerminal.exe且标题是正确的标题,则为正确的窗口句柄。 这个方案成功了!我把代码放一下,该代码的作用是自动判断是否用的是新终端,如果是则抓,如果不是则抓旧版控制台:

HWND hwnd = NULL;
bool ExistProcess(LPCSTR lpName)	//判断是否存在指定进程
{	//******警告!区分大小写!!!!******// //*****警告!必须加扩展名!!!!*****// HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);	if (INVALID_HANDLE_VALUE == hSnapshot) 	{		return false;	}	PROCESSENTRY32 pe = { sizeof(pe) };	BOOL fOk;	for (fOk = Process32First(hSnapshot, &pe); fOk; fOk = Process32Next(hSnapshot, &pe)) 	{		if (! stricmp(pe.szExeFile, lpName)) 		{			CloseHandle(hSnapshot);			return true;		}	}	return false;
}
bool TerminalCheck(DWORD dwPid, HWND _hwnd)
{HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);	if (INVALID_HANDLE_VALUE == hSnapshot) 	{		return false;	}	PROCESSENTRY32 pe = { sizeof(pe) };	BOOL fOk;	for (fOk = Process32First(hSnapshot, &pe); fOk; fOk = Process32Next(hSnapshot, &pe)) 	{		if (! stricmp(pe.szExeFile, "WindowsTerminal.exe") //进程名&& pe.th32ProcessID == dwPid) 		{			//stricmp不区分大小写的字符串比较CloseHandle(hSnapshot);			{char title[MAX_PATH];GetWindowText(_hwnd, title, MAX_PATH);if(strcmp(title, _pgmptr) && strcmp(title, "学生管理系统 " CURRENT_VERSION)) //_pgmptr是本体路径(用于还没来得及改标题的情况) 后面那个则是具体你设的标题,自定义即可return false;return true;}		}	}	return false;
}
BOOL CALLBACK EnumWindowsProc(HWND _hwnd, LPARAM lParam)
{ //回调函数DWORD pid;GetWindowThreadProcessId(_hwnd, &pid);if(TerminalCheck(pid, _hwnd)){printf("Terminal Found! pid=%ld hwnd=%p\n", pid, _hwnd);hwnd = _hwnd;return FALSE; //返回false中断枚举}return TRUE;
}int main(int argc, char* argv[])
{if(ExistProcess("WindowsTerminal.exe")){	//win11电脑且使用新版终端EnumWindows(EnumWindowsProc, 0);}else{	//旧版控制台主机hwnd = GetConsoleWindow();}//再不行就只能GetForegroundWindow了if(!hwnd || hwnd == INVALID_HANDLE_VALUE){hwnd = GetForegroundWindow();printf("Failed! using GetForegroundWindow...");}//其他的一些事情...return 0;
}

必要的头文件:stdio.h stdlib.h windows.h tlhelp32.h stdbool.h string.h

去试试看行不行,我刚试成功的代码

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/158949.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

web自动化测试十大问题+解决方法汇总,一篇概全...

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 1、启动浏览器报错…

合肥中科深谷嵌入式项目实战——基于ARM语音识别的智能家居系统(三)

基于ARM语音识别的智能家居系统 我们上一篇&#xff0c;我们实现在Linux系统下编译程序&#xff0c;我们首先通过两个小练习来熟悉一下如何去编译。今天&#xff0c;我们来介绍一下LCD屏幕基本使用。 一、LCD屏幕基本使用 如何使用LCD屏幕&#xff1f; 1、打开开发板LCD设…

NLP学习

参考&#xff1a;NLP发展之路I - 从词袋模型到Transformer - 知乎 (zhihu.com) NLP大致的发展历史。从最开始的词袋模型&#xff0c;到RNN&#xff0c;到Transformers和BERT&#xff0c;再到ChatGPT&#xff0c;NLP经历了一段不断精进的发展道路。数据驱动和不断完善的端到端的…

uniapp 打包后各静态资源加载失败的问题(背景图,字体等)

原因: 1.部署地址不在域名根目录下 解决办法(推荐办法2): 办法1.如果部署在域名的文件夹下(例如h5), 则运行的基础路径修改为/h5/ 且注意路由模式 办法2.不修改运行的基础路径(还是./), 将代码中涉及背景图(background-image)和字体资源的路径前统一加,如图:

【giszz笔记】产品设计标准流程【合集】【1.79 万字】

Tips&#xff1a;原笔记共8篇&#xff0c;本文是合集&#xff0c;字数较多&#xff0c;可收藏或关注。 目录 一、普通产品打造的流程 二、更标准一点的产品打造过程&#xff08;十一步&#xff09; &#xff08;一&#xff09;制定工作计划 &#xff08;二&#xff09;用户…

向上转型 向下转型 重写 多态 ---java

目录 一. 向上转型 1.1 概念 1.2 语法格式 1.3 动态绑定引入 1.4 重写的引入 1.5向上转型的使用方式 方式一: 直接赋值 方式二: 通过传参,进行向上转型(多态引入) 方法三:通过返回值, 进行向上转型 二. 重写 2.1 概念 2.2 重写的格式 2.3 重写的规则 【重写和重…

如何最大化客户生命周期价值?APMDR 模型在袋鼠云的落地实践

相信大家都认可一个观点&#xff1a;不论是 To B 还是 To C&#xff0c;用户是企业的核心资源&#xff0c;是互联网产品中最重要的价值之一。因此&#xff0c;深入挖掘用户价值成为现在大部分企业运营的关键。 之前我们为大家介绍过如何利用 RFM 模型让企业聚焦于更有价值的用…

数据分层:打造数据资产管家

一、引言 随着企业数据规模的增长&#xff0c;数据的价值变得越来越重要。然而&#xff0c;传统的数据库在承载大量数据时面临挑战&#xff0c;需要高效有序的维护。因此&#xff0c;建立高效的数据仓库成为了企业决策和管理的基石&#xff0c;但现代技术的背景下&#xff0c;…

动能方案 | 15693协议的读卡器应用 DP1363F 替代RC663

15693协议是一种高频&#xff08;13.56 MHz&#xff09;射频识别&#xff08;RFID&#xff09;协议&#xff0c;广泛满足无线识别和数据传输领域。其特点包括较远的读取范围、支持快速数据传输、与多个标签的兼容等&#xff0c;产生于不同行业有着广泛的应用&#xff0c;包括但…

【广州华锐互动】昆虫3D虚拟动态展示:探索神奇的微观世界

在这个充满科技魅力的时代&#xff0c;我们可以通过各种方式去了解和探索自然界的奥秘。而昆虫作为地球上最为丰富多样的生物群体之一&#xff0c;其独特的生活习性和形态特征一直吸引着人们的目光。 由广州华锐互动开发的昆虫3D虚拟动态展示系统&#xff0c;成为了一种全新的科…

Java异常处理机制

Java异常处理机制 一、异常概述与异常体系结构异常概述Error示例代码&#xff1a;Exception示例代码&#xff1a;异常体系结构Error和Exception的区别:异常分类检查异常非检查异常Why:为什么有非检查异常&#xff1f;Where:非检查异常有哪些&#xff1f;Exception异常划分运行时…

ModuleNotFoundError: No module named ‘pycocotools‘

cuda 12.1 pytorch 2.0.1 python 3.11 运行代码&#xff0c;报该错误&#xff0c;尝试了以下方法解决&#xff1a; 方法一 # step 1: 安装cython pip install Cython# step 2: 安装pycocotools pip install githttps://github.com/philferriere/cocoapi.git#eggpycocotools…

和田2023年群众舞蹈大赛总决赛圆满落幕!

11月19日&#xff0c;由中共和田地委宣传部主办&#xff0c;地区文旅局承办&#xff0c;地区文化馆、各县市文旅局协办&#xff0c;北京市援疆和田指挥部支持的和田地区2023年“大地欢歌 舞动和田”群众舞蹈大赛总决赛在和田市新夜市圆满落幕&#xff0c;比赛最终决出一等奖1名…

Adobe XD免费使用全攻略,详细教程来袭!

Adobexd是一种基于矢量的UI和UX设计工具。设计师可以使用Adobexd进行智能手表揭示设计、网页设计等。由于其强大的设计功能&#xff0c;Adobexd逐渐成为设计界的热门工具。作为一种海外设计工具&#xff0c;Adobexd是否免费也成为很多设计关注的话题&#xff0c;本文将为您解答…

Github Copilot AI编码完成工具

目录 一、GitHub Copilot 1、简介 2、工作原理 3、功能 二、GitHub Copilot X 1、什么是 GitHub Copilot X 2、GitHub Copilot X 的功能 三、支持、使用 1、支持 2、使用 四、实际研究、验证(代码方向) 1、代码生成 2、代码提示 3、生成测试用例 4、代码解释 5…

编译源码-【opencv3.4.16 + vs2013 x64】

编译机器&#xff1a;i5 13500HX RTX 4050 laptop win11 CMake 3.26.4 Configure&#xff0c;去掉勾选图中黄色标注的项&#xff0c;opencv_world 随意 Configure可能提示3rdparty下载timeout&#xff0c;它会下载到源码目录的.cache ├── .cache │ ├──ffmpeg │ │ …

Linux C 网络编程概述

网络编程 计算机网络概述分类网络体系结构通信协议通信流程网络通信帧格式以太网帧格式分析ARP 协议分析IP 数据报分析IP分类IP 分配子网掩码 TCP 段分析 TCP三次握手协议 ⭐TCP四次挥手协议 ⭐ TCP编程基于 TCP 客户端编程-步骤说明基于 TCP 服务器端编程-步骤说明基于 TCP 服…

汽车智能座舱/智能驾驶SOC -1

看到华为&小康的 AITO问界M6、M7各种广告营销、宣传、测评、好评如潮水般席卷网络各APP平台。翻看了中信和海通对特斯拉M3和比亚迪元的拆解报告&#xff0c;也好奇华为的汽车芯片平台又能做出哪些新花样&#xff0c;下面是Mark开头&#xff0c;也学习下智能座舱和智能驾驶芯…

MISRA 2012学习笔记(5)-Rules 8.10

文章目录 Rules8.10 基本类型模型(The essential type model)8.10.1 原理8.10.2 基本类型(Essential type)Rule 10.1 操作数不得具有不适当的基本类型Rule 10.2 在加减法运算中&#xff0c;不得不当使用本质为字符类型的表达式Rule 10.3 表达式的值不得赋值给具有较窄基本类型或…

单线程的JS中Vue导致的“线程安全”问题

目录 现象分析原因 浏览器中Js是单线程的&#xff0c;当然不可能出现线程安全问题。只是遇到的问题的现象与多线程的情况十分相似&#xff0c;导致对不了解Vue实现的我怀疑起了人生… 现象 项目中用到了element-plus中的加载组件&#xff0c;简单封装了一下&#xff0c;用来保…