当前位置: 首页 > 知识库问答 >
问题:

前端 - 如何在使用getDisplayMedia或desktopCapturer时获取最小化的窗口?

史昊焱
2025-01-05

如题:如果一个窗口被手动最小化了,那么选项框里就不会出现该窗口的选项

已经最小化了vscode和edge,窗口里并没有这两个选项
测试代码如下:

    // 浏览器
    navigator.mediaDevices.getDisplayMedia()
    // electron应用中
    desktopCapturer.getSources({
          types: ['window', 'screen'],
          fetchWindowIcons: true
    })

业务场景需要做屏幕共享,由用户选择需要共享的窗口。某tx会议屏幕共享的时候,窗口最小化后仍然能够选择。

目前在mdn里并没有找到对应最小化窗口选择相关的描述;在w3c里只有这么一段描述,简单地说明了以下最小化窗口可能影响正在共享的窗口

**请问各路大神有什么方法能够展示最小化的窗口用以选择?或者有没有其他的方法获取到最小化的窗口?
感谢**

共有3个答案

鲜于岳
2025-01-05

基于web的话,实现不了的。
getUserMedia 的浏览器实现,对于上层使用方提供的能力非常有限,相当于是黑盒的。

钮才哲
2025-01-05

看起来你似乎无法做到这一点

Screen share with Chrome picker does not list minimized windows to share

张子墨
2025-01-05
  • 如果你是特指的Windows平台,那么可以使用 node-ffi-napi 和 ref-napi 调用 Windows API来枚举系统中的所有窗口.

    const { app, BrowserWindow } = require('electron');
    const ffi = require('ffi-napi');
    const ref = require('ref-napi');
    
    // 定义 Windows API 函数
    const user32 = new ffi.Library('user32', {
      'EnumWindows': ['bool', ['pointer', 'int32']],
      'GetWindowTextW': ['int', ['pointer', 'pointer', 'int']],
      'IsWindowVisible': ['bool', ['pointer']],
      'IsIconic': ['bool', ['pointer']],
      'GetWindowThreadProcessId': ['uint32', ['pointer', 'pointer']]
    });
    
    const windowTextBuffer = Buffer.alloc(255 * 2); // 255 WCHARs
    
    // 枚举窗口回调函数
    const enumWindowsProc = ffi.Callback('bool', ['pointer', 'int32'], (hWnd, lParam) => {
      const isVisible = user32.IsWindowVisible(hWnd);
      const isMinimized = user32.IsIconic(hWnd);
    
      const length = user32.GetWindowTextW(hWnd, windowTextBuffer, 255);
      const windowTitle = ref.reinterpretUntilZeros(windowTextBuffer, length * 2).toString('ucs2');
      const processIdBuffer = ref.alloc('uint32');
      user32.GetWindowThreadProcessId(hWnd, processIdBuffer);
      const processId = processIdBuffer.deref();
    
      console.log(`Window Title: ${windowTitle}, Process ID: ${processId}, Visible: ${isVisible}, Minimized: ${isMinimized}`);
    
      return true; // 继续枚举
    });
    
    app.on('ready', () => {
      // 创建一个示例窗口
      let mainWindow = new BrowserWindow({ width: 800, height: 600 });
      mainWindow.loadURL('https://example.com');
    
      // 枚举所有窗口
      user32.EnumWindows(enumWindowsProc, 0);
    });
  • 如果要跨平台,也许可以参考node-window-manager库。
 类似资料:
  • 问题内容: 我需要将注意力集中在指定的窗口上,而我头上看到的唯一方法是将其前面的所有窗口最小化,直到找到正确的窗口为止。 我该怎么做? Windows 7,没有特定的工具包…。 每种类型的窗口,例如,firefox和控制台命令 问题答案: 您需要通过窗口枚举并匹配窗口标题才能获得所需的窗口。下面的代码搜索标题为“ firefox”的窗口并设置焦点: 为了最小化窗口,下面的行:

  • 问题内容: 我正在尝试做的是: 我正在尝试使用pywinauto在python中创建脚本以在后台自动安装notepad (隐藏或最小化),notepad 只是一个示例,因为我将对其进行编辑以与其他软件一起使用。 问题: 问题是我想在隐藏安装程序或最小化安装程序的情况下执行此操作,但是如果我移动鼠标,脚本将停止工作。 题: 在隐藏或最小化notepad ++安装程序的情况下,如何执行此脚本并使之运行

  • 我是Javafx新手,我正在从事Javafx项目。我想最小化javafx窗口。我使用初级阶段。initStyle(舞台风格。未装饰)。我还想将clickevent添加到fxml中的imageview中。

  • 问题内容: 在我的Java应用程序中,我有一个JFrame窗口,如何从Java程序中最小化它? 问题答案: 最小化 用还原

  • 问题内容: 我正在使用Python创建Eve Online API的GUI前端。 我已经成功地从他们的服务器中提取了XML数据。 我正在尝试从名为“名称”的节点获取值: 这似乎找到了节点,但是输出如下: 如何获取它以打印节点的值? 问题答案: 应该只是

  • 有没有办法让最后一行和列使用在根窗口或顶层使用tkinter? 其目的是每次按下按钮时,在新行上逐个添加输入框。 因此,我将使用上次使用的行的信息,用grid()定位新生成的输入框。 提前谢谢。

  • 我正在最小化一个表单到系统托盘(显示一个托盘图标),同时保留它的任务栏按钮,当它没有最小化。这意味着在窗体最小化时移除任务栏按钮,否则将其还原。 实现这一点的最简单方法是隐藏/显示窗体,最小化的窗口无论如何都不会显示。 ,如果我移动代码(更不用说窗口可以通过 等最小化),它不会导致任何进展。 没有它。这里类似的问题试图处理第一次显示窗口时显示的动画,尽管该动画似乎与DWM相关,并且Minimize

  • 问题内容: 是否可以通过事件监听器访问JFrame对象,以检测用户何时单击窗口的最大化或最小化按钮? 我正在使用JFrame对象,如下所示: 问题答案: 您可以使用WindowStateListener。如何编写窗口侦听器教程演示了如何创建与窗口相关的事件处理程序。