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

新手上路,请多包涵

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

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

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

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

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

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

阅读 172
3 个回答
新手上路,请多包涵
  • 如果你是特指的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库。

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

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏