菜鸟学ffmpeg音视频技术之7 mac枚举窗口

CATIA VBA二次开发(二) 快速入门之VBA IDE 本文介绍了如何快速创建CATIA VBA项目,如何进行基本的编辑操作。参考上一节内容,给出了一个演示示例 阅读详情

https://blog.youkuaiyun.com/xpg4321/article/details/112357480 介绍了如何截屏

因为录制可能需要录制窗口,这里介绍如何枚举mac屏幕的窗口。

1.定义保存窗口信息的结构


struct  WindowPoint {
      int x;
      int y;
  };
  struct  MousePoint {
      WindowPoint Position;
      WindowPoint HotSpot;
  };
  struct  Window {
      uint32_t Handle{0};
      WindowPoint Position;

      WindowPoint Size;
      // Name will always be lower case. It is converted to lower case internally by the library for comparisons
      char Name[256] = {0};
  };

      uint32_t Handle{0}      窗口句柄类似windows的HWND,

      WindowPoint Position;  窗口的位置

      WindowPoint Size; 窗口的大小

2.获取显示区域个数

      CGDisplayCount count=0;
      CGGetActiveDisplayList(0, 0, &count);
      std::vector<CGDirectDisplayID> displays;
      displays.resize(count);
      CGGetActiveDisplayList(count, displays.data(), &count);

主要考虑扩展屏平

3.遍历显示区域获取缩放因子

      auto xscale=1.0f;
      auto yscale = 1.0f;

      for(auto  i = 0; i < count; i++) {
          //only include non-mirrored displays
          if(CGDisplayMirrorsDisplay(displays[i]) == kCGNullDirectDisplay){

              auto dismode =CGDisplayCopyDisplayMode(displays[i]);
              auto scaledsize = CGDisplayBounds(displays[i]);

              auto pixelwidth = CGDisplayModeGetPixelWidth(dismode);
              auto pixelheight = CGDisplayModeGetPixelHeight(dismode);

              CGDisplayModeRelease(dismode);

              if(scaledsize.size.width !=pixelwidth){//scaling going on!
                  xscale = static_cast<float>(pixelwidth)/static_cast<float>(scaledsize.size.width);
              }
              if(scaledsize.size.height !=pixelheight){//scaling going on!
                  yscale = static_cast<float>(pixelheight)/static_cast<float>(scaledsize.size.height);
              }
              break;
          }
      }

缩放因子用于计算窗口的实际大小。

4.获取窗口个数

     auto windowList = CGWindowListCopyWindowInfo(kCGWindowListOptionOnScreenOnly, kCGNullWindowID);
      Window ret;
      CFIndex numWindows = CFArrayGetCount(windowList );

5. 遍历窗口获取窗口信息

for( int i = 0; i < (int)numWindows; i++ ) {
          Window w = {};
          uint32_t windowid=0;
          auto dict = static_cast<CFDictionaryRef>(CFArrayGetValueAtIndex(windowList, i));
          auto cfwindowname = static_cast<CFStringRef>(CFDictionaryGetValue(dict, kCGWindowName));
          if(cfwindowname == nullptr)
              continue;
          CFStringGetCString(cfwindowname, w.Name, sizeof(w.Name), kCFStringEncodingUTF8);
          w.Name[sizeof(w.Name)-1] = '\n';


          CFNumberGetValue(static_cast<CFNumberRef>(CFDictionaryGetValue(dict, kCGWindowNumber)), kCFNumberIntType, &windowid);
          w.Handle = static_cast<size_t>(windowid);

          auto dims =static_cast<CFDictionaryRef>(CFDictionaryGetValue(dict,kCGWindowBounds));
          CGRect rect;
          CGRectMakeWithDictionaryRepresentation(dims, &rect);
          w.Position.x = static_cast<int>(rect.origin.x);
          w.Position.y = static_cast<int>(rect.origin.y);

          w.Size.x = static_cast<int>(rect.size.width * xscale);
          w.Size.y = static_cast<int>(rect.size.height* yscale);
          std::string strName = w.Name;

         if(strName == name)
         {
             ret = w;
             break;
         }

      }
      CFRelease(windowList);

6.最终代码

根据窗口名字获取窗口信息:

Window MacScreenCaputre::getWindow(const std::string &name)
{
      CGDisplayCount count=0;
      CGGetActiveDisplayList(0, 0, &count);
      std::vector<CGDirectDisplayID> displays;
      displays.resize(count);
      CGGetActiveDisplayList(count, displays.data(), &count);
      auto xscale=1.0f;
      auto yscale = 1.0f;

      for(auto  i = 0; i < count; i++) {
          //only include non-mirrored displays
          if(CGDisplayMirrorsDisplay(displays[i]) == kCGNullDirectDisplay){

              auto dismode =CGDisplayCopyDisplayMode(displays[i]);
              auto scaledsize = CGDisplayBounds(displays[i]);

              auto pixelwidth = CGDisplayModeGetPixelWidth(dismode);
              auto pixelheight = CGDisplayModeGetPixelHeight(dismode);

              CGDisplayModeRelease(dismode);

              if(scaledsize.size.width !=pixelwidth){//scaling going on!
                  xscale = static_cast<float>(pixelwidth)/static_cast<float>(scaledsize.size.width);
              }
              if(scaledsize.size.height !=pixelheight){//scaling going on!
                  yscale = static_cast<float>(pixelheight)/static_cast<float>(scaledsize.size.height);
              }
              break;
          }
      }

      auto windowList = CGWindowListCopyWindowInfo(kCGWindowListOptionOnScreenOnly, kCGNullWindowID);
      Window ret;
      CFIndex numWindows = CFArrayGetCount(windowList );

      for( int i = 0; i < (int)numWindows; i++ ) {
          Window w = {};
          uint32_t windowid=0;
          auto dict = static_cast<CFDictionaryRef>(CFArrayGetValueAtIndex(windowList, i));
          auto cfwindowname = static_cast<CFStringRef>(CFDictionaryGetValue(dict, kCGWindowName));
          if(cfwindowname == nullptr)
              continue;
          CFStringGetCString(cfwindowname, w.Name, sizeof(w.Name), kCFStringEncodingUTF8);
          w.Name[sizeof(w.Name)-1] = '\n';


          CFNumberGetValue(static_cast<CFNumberRef>(CFDictionaryGetValue(dict, kCGWindowNumber)), kCFNumberIntType, &windowid);
          w.Handle = static_cast<size_t>(windowid);

          auto dims =static_cast<CFDictionaryRef>(CFDictionaryGetValue(dict,kCGWindowBounds));
          CGRect rect;
          CGRectMakeWithDictionaryRepresentation(dims, &rect);
          w.Position.x = static_cast<int>(rect.origin.x);
          w.Position.y = static_cast<int>(rect.origin.y);

          w.Size.x = static_cast<int>(rect.size.width * xscale);
          w.Size.y = static_cast<int>(rect.size.height* yscale);
          std::string strName = w.Name;

         if(strName == name)
         {
             ret = w;
             break;
         }

      }
      CFRelease(windowList);
      return ret;
  }

 

VBA语言的软件开发工具 VBA是一种由微软开发的事件驱动编程语言,主要用于自动化Microsoft Office应用程序(如Excel、Word、Access等)的操作。由于其直观易学的特点,VBA逐渐成为了非程序员用户进行软件开发的首选语言。VBA可以通过宏的方式,让用户记录和执行重复的操作,也可以通过编写代码创建复杂的功能。VBA作为一种强大的办公自动化工具,以其易学性、自动化能力和与Office的深度集成,广泛应用于各个行业。虽然VBA存在一些局限性,如运行速度较慢和跨平台性差,但在办公环境中,其优势依然显著。 阅读详情

相关推荐

VBA编程教程(基础二)

VBA基础教程 文章目录VBA基础教程VBA简介VBA环境简单介绍第一个代码过程函数基本语法变量数据类型时间函数字符串Format格式字符串常量运算符算术运算符比较运算符逻辑运算符运算符比较数组输入和输出控制程序流程顺序语句判断语句判断条件循环语句For Each-Next语句Exit语句With语句调试程序Debug调试IDE调试错误处理事件触发工作簿的事件窗体事件OnTime事件窗体按钮控件文本框控件excel里面的窗体使用 VBA简介 VBA即Visual Basic For Appilication

O_MMMM_O的博客 1万+

滑动窗口问题

我借鉴大佬的代码如下: public static int lengthOfLongestSubstring(String s) { char[] c = s.toCharArray(); if (c.length == 0) return 0; int l = 0, r = 0, m = 0; for (; r < c.length; r++) { for (int k = l; k < r; k++) { if (c[k] == c[r]) { .

qq_47627886的博客 282

Excel宏编程技巧与应用实战

宏是一种自动化指令的集合,可以自动化执行一系列重复性的任务,从而大幅提高工作效率。在Excel中,宏是通过VBA(Visual Basic for Applications)编程实现的。VBA是一种强大的编程语言,专门用于Office软件的自动化。VBA的集成开发环境提供了一系列工具,使得编写、调试和管理宏变得简单。IDE包括以下几个关键部分:编辑器窗口:用于编写和编辑VBA代码。工具箱:提供了一系列用于创建用户表单和控件的工具。属性窗口:用来更改选定对象的属性。

weixin_42263617的博客 839

引领VBA代码管理新时代:VBA IDE CodeExport

引领VBA代码管理新时代:VBA IDE CodeExport 项目简介 VBA IDE CodeExport,一个纯VBA编写的Excel插件,让你无需安装额外的COM组件即可将你的Excel VBA项目源码导出,适用于版本控制系统如Git。这个插件特别为Excel设计,但其VBIDE扩展性使其也能应用于整个MS Office套件。 它不仅能够导出.cls, .bas, 和.frm文件,还能处理...

gitblog_00047的博客 789

VBA manual(微软官方VBA手册)

VBA manual 英文原版 微软官方出品 简单清楚 VBA编程入门最好的书籍

VBA的妙用:串口通讯程序与EXCEL相结合

VisualBasic的应用程序版(VBA)是Microsoft公司长期追求的目标,使可编程应用软件得到完美的实现,它作为一种通用的宏语言可被所有的Microsoft可编程应用软件所共享。

推荐开源项目:VBA IDE CodeExport

推荐开源项目:VBA IDE CodeExport 在Excel的宏世界里,版本控制常常是开发者头疼的问题。但是有了VBA IDE CodeExport,这一切变得轻松无比。本篇文章将深度解析这一神器,探讨其技术原理,应用场景,并突出其独特之处,带你领略如何优雅地管理Excel中的VBA代码。 项目介绍 VBA IDE CodeExport是一个专为Excel设计的开源工具,通过纯VBA编写的插件...

gitblog_00712的博客 939

图像评价之计算PSNR、SSIM、MSE、LPIPS和NIQE评价指标

如果代码对你的研究有所帮助,请为该仓库点上小星星。

书山有路,学海无涯! 2645

常用的编写VBA的软件 (L*00K)

综上所述,可以编写VBA的软件主要包括Microsoft Office套件中的Excel、Access、PowerPoint和Word,以及集成开发环境Visual Studio等。此外,还有一些辅助工具可以帮助用户提高VBA编程的效率和便利性。

Life is short, use Python 2747

tanner2019安装教程

tanner2019安装教程 tanner安装包 软件由老师提供,但由于老师给的方法不知怎么回事无法使用就自己找了一些方法,本教程仅提供参考 链接:https://pan.baidu.com/s/1A2O6JuEF8YFbe8bPnD3J6w 提取码:ysif 复制这段内容后打开百度网盘手机App,操作更方便哦 安装过程 1.选择TannerTools_v2019.2-Win64.exe,进行安装。 2.选择安装产品 3.选择目标路径 4.确认安装 5.安装成功,退出。 获取许可过程 1.打开key压缩

weixin_47730560的博客 1万+

软件测试工程师最常用的Linux系统命令大全(汇总)

cd命令这是一个非常基本,也是大家经常需要使用的命令,它用于切换当前目录,它的参数是要切换到的目录的路径,可以是绝对路径,也可以是相对路径。

1330

Excel VBA串口通信

用c#也可以实现这种功能,那就是用serialPort控件,这里用VBA写的,用MSComm控件实现。其实还有另外一个控件叫NETComm控件,也可以做,源码中注释很清楚,不再赘述Private Sub btn_Close_Click()MSComm1.PortOpen = False 打开串口btn_Start.Enabled = True 连接按钮响应btn_Close.E

wxxloveu的专栏 2万+

ArcGIS | 全球新冠肺炎地图数据下载和处理

ArcGIS

thinkpang的博客 2900

【免费下载】 推荐项目:VBADeveloper - 强大的VBA编程工具

是一个免费且开源的Visual Basic for Applications (VBA) 开发环境增强工具,旨在提升VBA编码的效率和质量。对于那些在Microsoft Office应用中(如Excel, Word, PowerPoint等)使用VBA进行自动化处理或开发宏的用户来说,这是一个非常值得尝试的项目。 ## 技术分析 1. **代码高亮**:VBADeveloper提供了色彩鲜明的...

gitblog_00056的博客 2777

Android Google 支付接入

1. 从 2023 年 8 月 2 日起,所有新应用都必须使用结算库版本 5 或更高版本。自 2023 年 11 月 1 日起,现有应用的所有新版本都必须使用结算库版本 5 或更高版本。 2. 如果您的应用以 Android 14 或更高版本为目标平台,您必须更新到 PBL 5.2.1 或 PBL 6.0.1 或更高版本。

帅次的博客 9404

从 0 到 1 玩转小智 AI 智能音箱:开发教程 + 实战项目全攻略

如果说 MCP 是工具箱,那 SDK 就是 “技能模板”—— 小智音箱的自定义技能本质是 “意图识别 + 逻辑响应” 的组合,就像给嵌入式设备写驱动程序,只要按规则调用接口,就能实现各种功能。小智 AI 音箱的开发门槛并不高,核心是利用 MCP SDK 封装好的接口,结合嵌入式开发的 “硬件对接 + 逻辑编程” 思维,就能实现各种自定义功能。从环境搭建到技能开发,再到实战项目落地,每一步都是对 “软件控制硬件” 的实践 —— 而这正是嵌入式开发的核心魅力。

weixin_42300449的博客 1193

VBA-IDE-Code-Export 项目推荐

VBA-IDE-Code-Export 项目推荐 1. 项目基础介绍及编程语言 VBA-IDE-Code-Export 是一个开源项目,旨在为 Excel 的 VBA(Visual Basic for Applications)项目提供一种方式,使其源代码能够与 Git 或其他版本控制系统(VCS)兼容。该项目主要通过 VBA 编程语言实现,同时涉及到一些配置文件的处理,使用了 JSON 格式。 ...

gitblog_00022的博客 422

【首发独家】华为OD机试 - 服务中心选址、服务中心的最佳位置(C 语言解题)

最近更新的博客 华为 od 2023 | 什么是华为 od,od 薪资待遇,od 机试题清单 华为 OD 机试真题大全,用 Python 解华为机试题 | 机试宝典 【华为 OD 机试】全流程解析+经验分享,题型分享,防作弊指南 华为 od 机试,独家整理 已参加机试人员的实战技巧 本篇华为 OD 机试题解:服务中心选址、服务中心的最佳位置

梦想橡皮擦,专栏100例写作模式先行者,现象级专栏 《Python 爬虫 100 例》作者、《滚雪球学 Python 专栏》原创者 1万+

Excel VBA入门指南:解锁开发工具与编写你的第一个程序

在日常办公中,Excel 是处理数据的得力助手,但你是否想过让它完成更复杂、自动化的任务?通过 VBA(Visual Basic for Applications)编程,就能赋予 Excel “超能力”。本文将带你一步步打开 Excel 开发工具,编写属于你的第一个 VBA 程序,解锁 Excel 的隐藏技能。

xiaozhi_wei的博客 6015

51智能小车(双轮)

前几天接了个小单子,是一个基于51单品机的作品,发现自己对小车的认识还是不太🆗。也算是完成了任了的;欢迎各位小伙伴来多多交流,大家一起进步。最后有需要单片机课程设计的小伙伴滴滴我哦(有偿)。企鹅:2397746994。

qq_56992543的博客 2346

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

Mac OS 列出用户其他WINDOW 以及向其他WINDOW发送消息

- (void)screenShot { CFArrayRef windowListArray = CGWindowListCreate(kCGWindowListOptionOnScreenOnly, kCGNullWindowID); NSArray *windows = CFBridgingRelease(CGWindowListCreateDescri...

quanhaoH的专栏 5895

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

【亲测免费】 VBA-IDE-Code-Export 项目常见问题解决方案

VBA-IDE-Code-Export 项目常见问题解决方案 项目基础介绍 VBA-IDE-Code-Export 是一个用于将 Excel VBA 项目源代码导出以便与 Git(或其他版本控制系统)配合使用的开源项目。该项目通过一个纯 VBA 插件实现代码的导出和导入,无需安装 COM 插件。主要编程语言为 VBA(Visual Basic for Applications)。 新手使用注意事项...

gitblog_00326的博客 570

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

VBA-IDE-Code-Export 项目教程

VBA-IDE-Code-Export 项目教程 项目介绍 VBA-IDE-Code-Export 是一个开源项目,旨在帮助开发者通过 Git 或其他版本控制系统管理和导出 VBA 代码。该项目提供了一套工具和方法,使得 VBA 代码的版本控制和协作变得更加容易。 项目快速启动 安装 克隆仓库: git clone https://github.com/spences10/VBA-IDE-Co...

gitblog_01159的博客 1056

TensorFlow目标检测完整指南:YOLO与Faster R-CNN实现详解

TensorFlow目标检测技术为计算机视觉应用提供了强大的支持,能够精确识别图像中的物体位置和类别。本文作为TensorFlow目标检测的完整教程,将深入解析YOLO和Faster R-CNN两大主流算法的实现原理,帮助初学者快速掌握这一关键技术。🎯 ## 🔍 什么是目标检测? 目标检测(Object Detection)是计算机视觉中的核心任务,不仅要识别图像中有什么物体,还要确定它们

gitblog_00074的博客 650

Qt实现截图之一 截图

最近项目需要使用qt实现截图功能,再次记录一下,希望对您有所帮助,qt我是用的是5.9.9版本。 1.截图 qt截图推荐使用QScreen来实现截图,使用grab这种方式只能截窗体且窗体如果是opengl窗体或者视频窗体无法获取数据。 1.截主屏幕 截主屏幕代码相对简单 QScreen* screen = QApplication::primaryScreen(); QPixmap pixmap = screen->grabWindow(QApplication::deskt

xpg4321的博客 5167
上一篇: 菜鸟学ffmpeg音视频技术之6 mac截屏
下一篇: 菜鸟学ffmpeg音视频技术之8 mac窗口截图
很菜但努力
博客等级 码龄17年 113粉丝 50原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值