capture.interop.h 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137
  1. #pragma once
  2. #include <guiddef.h>
  3. #include <winrt/Windows.Graphics.Capture.h>
  4. #include <windows.graphics.capture.interop.h>
  5. #include <windows.graphics.capture.h>
  6. // 包含调试宏定义
  7. #include "../../../basic/basic.h"
  8. inline auto CreateCaptureItemForWindow(HWND hwnd)
  9. {
  10. // 首先检查窗口句柄是否有效
  11. if (!hwnd || !::IsWindow(hwnd)) {
  12. __DebugPrint("CreateCaptureItemForWindow: Invalid window handle (HWND=0x%p)", hwnd);
  13. return winrt::Windows::Graphics::Capture::GraphicsCaptureItem{nullptr};
  14. }
  15. // 检查窗口是否可见
  16. if (!::IsWindowVisible(hwnd)) {
  17. __DebugPrint("CreateCaptureItemForWindow: Window is not visible (HWND=0x%p)", hwnd);
  18. // 注意:不可见的窗口仍然可以被捕获,所以这里只是警告
  19. }
  20. try {
  21. auto activation_factory = winrt::get_activation_factory<winrt::Windows::Graphics::Capture::GraphicsCaptureItem>();
  22. auto interop_factory = activation_factory.as<IGraphicsCaptureItemInterop>();
  23. winrt::Windows::Graphics::Capture::GraphicsCaptureItem item = {nullptr};
  24. HRESULT hr = interop_factory->CreateForWindow(hwnd,
  25. winrt::guid_of<ABI::Windows::Graphics::Capture::IGraphicsCaptureItem>(),
  26. reinterpret_cast<void**>(winrt::put_abi(item)));
  27. if (FAILED(hr)) {
  28. __DebugPrint("CreateCaptureItemForWindow: CreateForWindow failed with HRESULT=0x%08lx (HWND=0x%p)",
  29. static_cast<unsigned long>(hr), hwnd);
  30. // 提供更详细的错误信息
  31. switch (hr) {
  32. case E_INVALIDARG:
  33. __DebugPrint(" Error: Invalid argument - window handle may be invalid");
  34. break;
  35. case E_ACCESSDENIED:
  36. __DebugPrint(" Error: Access denied - window may be protected or system window");
  37. break;
  38. case DXGI_ERROR_UNSUPPORTED:
  39. __DebugPrint(" Error: Unsupported - window capture not supported for this window");
  40. break;
  41. case E_NOINTERFACE:
  42. __DebugPrint(" Error: No interface - WGC may not be available on this system");
  43. break;
  44. default:
  45. __DebugPrint(" Error: Unknown error code");
  46. break;
  47. }
  48. return winrt::Windows::Graphics::Capture::GraphicsCaptureItem{nullptr};
  49. }
  50. __DebugPrint("CreateCaptureItemForWindow: Successfully created capture item (HWND=0x%p)", hwnd);
  51. return item;
  52. } catch (const winrt::hresult_error& e) {
  53. __DebugPrint("CreateCaptureItemForWindow: WinRT exception - HRESULT=0x%08lx, Message=%s (HWND=0x%p)",
  54. static_cast<unsigned long>(e.code()),
  55. winrt::to_string(e.message()).c_str(),
  56. hwnd);
  57. return winrt::Windows::Graphics::Capture::GraphicsCaptureItem{nullptr};
  58. } catch (const std::exception& e) {
  59. __DebugPrint("CreateCaptureItemForWindow: Standard exception - %s (HWND=0x%p)", e.what(), hwnd);
  60. return winrt::Windows::Graphics::Capture::GraphicsCaptureItem{nullptr};
  61. } catch (...) {
  62. __DebugPrint("CreateCaptureItemForWindow: Unknown exception (HWND=0x%p)", hwnd);
  63. return winrt::Windows::Graphics::Capture::GraphicsCaptureItem{nullptr};
  64. }
  65. }
  66. inline auto CreateCaptureItemForMonitor(HMONITOR monitor)
  67. {
  68. // 检查显示器句柄是否有效
  69. if (!monitor) {
  70. __DebugPrint("CreateCaptureItemForMonitor: Invalid monitor handle (HMONITOR=0x%p)", monitor);
  71. return winrt::Windows::Graphics::Capture::GraphicsCaptureItem{nullptr};
  72. }
  73. try {
  74. auto activation_factory = winrt::get_activation_factory<winrt::Windows::Graphics::Capture::GraphicsCaptureItem>();
  75. auto interop_factory = activation_factory.as<IGraphicsCaptureItemInterop>();
  76. winrt::Windows::Graphics::Capture::GraphicsCaptureItem item = {nullptr};
  77. HRESULT hr = interop_factory->CreateForMonitor(monitor,
  78. winrt::guid_of<ABI::Windows::Graphics::Capture::IGraphicsCaptureItem>(),
  79. reinterpret_cast<void**>(winrt::put_abi(item)));
  80. if (FAILED(hr)) {
  81. __DebugPrint("CreateCaptureItemForMonitor: CreateForMonitor failed with HRESULT=0x%08lx (HMONITOR=0x%p)",
  82. static_cast<unsigned long>(hr), monitor);
  83. // 提供更详细的错误信息
  84. switch (hr) {
  85. case E_INVALIDARG:
  86. __DebugPrint(" Error: Invalid argument - monitor handle may be invalid");
  87. break;
  88. case E_ACCESSDENIED:
  89. __DebugPrint(" Error: Access denied - monitor capture may be restricted");
  90. break;
  91. case DXGI_ERROR_UNSUPPORTED:
  92. __DebugPrint(" Error: Unsupported - monitor capture not supported");
  93. break;
  94. case E_NOINTERFACE:
  95. __DebugPrint(" Error: No interface - WGC may not be available on this system");
  96. break;
  97. default:
  98. __DebugPrint(" Error: Unknown error code");
  99. break;
  100. }
  101. return winrt::Windows::Graphics::Capture::GraphicsCaptureItem{nullptr};
  102. }
  103. __DebugPrint("CreateCaptureItemForMonitor: Successfully created capture item (HMONITOR=0x%p)", monitor);
  104. return item;
  105. } catch (const winrt::hresult_error& e) {
  106. __DebugPrint("CreateCaptureItemForMonitor: WinRT exception - HRESULT=0x%08lx, Message=%s (HMONITOR=0x%p)",
  107. static_cast<unsigned long>(e.code()),
  108. winrt::to_string(e.message()).c_str(),
  109. monitor);
  110. return winrt::Windows::Graphics::Capture::GraphicsCaptureItem{nullptr};
  111. } catch (const std::exception& e) {
  112. __DebugPrint("CreateCaptureItemForMonitor: Standard exception - %s (HMONITOR=0x%p)", e.what(), monitor);
  113. return winrt::Windows::Graphics::Capture::GraphicsCaptureItem{nullptr};
  114. } catch (...) {
  115. __DebugPrint("CreateCaptureItemForMonitor: Unknown exception (HMONITOR=0x%p)", monitor);
  116. return winrt::Windows::Graphics::Capture::GraphicsCaptureItem{nullptr};
  117. }
  118. }