| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137 |
- #pragma once
- #include <guiddef.h>
- #include <winrt/Windows.Graphics.Capture.h>
- #include <windows.graphics.capture.interop.h>
- #include <windows.graphics.capture.h>
- // 包含调试宏定义
- #include "../../../basic/basic.h"
- inline auto CreateCaptureItemForWindow(HWND hwnd)
- {
- // 首先检查窗口句柄是否有效
- if (!hwnd || !::IsWindow(hwnd)) {
- __DebugPrint("CreateCaptureItemForWindow: Invalid window handle (HWND=0x%p)", hwnd);
- return winrt::Windows::Graphics::Capture::GraphicsCaptureItem{nullptr};
- }
-
- // 检查窗口是否可见
- if (!::IsWindowVisible(hwnd)) {
- __DebugPrint("CreateCaptureItemForWindow: Window is not visible (HWND=0x%p)", hwnd);
- // 注意:不可见的窗口仍然可以被捕获,所以这里只是警告
- }
-
- try {
- auto activation_factory = winrt::get_activation_factory<winrt::Windows::Graphics::Capture::GraphicsCaptureItem>();
- auto interop_factory = activation_factory.as<IGraphicsCaptureItemInterop>();
- winrt::Windows::Graphics::Capture::GraphicsCaptureItem item = {nullptr};
-
- HRESULT hr = interop_factory->CreateForWindow(hwnd,
- winrt::guid_of<ABI::Windows::Graphics::Capture::IGraphicsCaptureItem>(),
- reinterpret_cast<void**>(winrt::put_abi(item)));
-
- if (FAILED(hr)) {
- __DebugPrint("CreateCaptureItemForWindow: CreateForWindow failed with HRESULT=0x%08lx (HWND=0x%p)",
- static_cast<unsigned long>(hr), hwnd);
-
- // 提供更详细的错误信息
- switch (hr) {
- case E_INVALIDARG:
- __DebugPrint(" Error: Invalid argument - window handle may be invalid");
- break;
- case E_ACCESSDENIED:
- __DebugPrint(" Error: Access denied - window may be protected or system window");
- break;
- case DXGI_ERROR_UNSUPPORTED:
- __DebugPrint(" Error: Unsupported - window capture not supported for this window");
- break;
- case E_NOINTERFACE:
- __DebugPrint(" Error: No interface - WGC may not be available on this system");
- break;
- default:
- __DebugPrint(" Error: Unknown error code");
- break;
- }
-
- return winrt::Windows::Graphics::Capture::GraphicsCaptureItem{nullptr};
- }
-
- __DebugPrint("CreateCaptureItemForWindow: Successfully created capture item (HWND=0x%p)", hwnd);
- return item;
-
- } catch (const winrt::hresult_error& e) {
- __DebugPrint("CreateCaptureItemForWindow: WinRT exception - HRESULT=0x%08lx, Message=%s (HWND=0x%p)",
- static_cast<unsigned long>(e.code()),
- winrt::to_string(e.message()).c_str(),
- hwnd);
- return winrt::Windows::Graphics::Capture::GraphicsCaptureItem{nullptr};
- } catch (const std::exception& e) {
- __DebugPrint("CreateCaptureItemForWindow: Standard exception - %s (HWND=0x%p)", e.what(), hwnd);
- return winrt::Windows::Graphics::Capture::GraphicsCaptureItem{nullptr};
- } catch (...) {
- __DebugPrint("CreateCaptureItemForWindow: Unknown exception (HWND=0x%p)", hwnd);
- return winrt::Windows::Graphics::Capture::GraphicsCaptureItem{nullptr};
- }
- }
- inline auto CreateCaptureItemForMonitor(HMONITOR monitor)
- {
- // 检查显示器句柄是否有效
- if (!monitor) {
- __DebugPrint("CreateCaptureItemForMonitor: Invalid monitor handle (HMONITOR=0x%p)", monitor);
- return winrt::Windows::Graphics::Capture::GraphicsCaptureItem{nullptr};
- }
-
- try {
- auto activation_factory = winrt::get_activation_factory<winrt::Windows::Graphics::Capture::GraphicsCaptureItem>();
- auto interop_factory = activation_factory.as<IGraphicsCaptureItemInterop>();
- winrt::Windows::Graphics::Capture::GraphicsCaptureItem item = {nullptr};
-
- HRESULT hr = interop_factory->CreateForMonitor(monitor,
- winrt::guid_of<ABI::Windows::Graphics::Capture::IGraphicsCaptureItem>(),
- reinterpret_cast<void**>(winrt::put_abi(item)));
-
- if (FAILED(hr)) {
- __DebugPrint("CreateCaptureItemForMonitor: CreateForMonitor failed with HRESULT=0x%08lx (HMONITOR=0x%p)",
- static_cast<unsigned long>(hr), monitor);
-
- // 提供更详细的错误信息
- switch (hr) {
- case E_INVALIDARG:
- __DebugPrint(" Error: Invalid argument - monitor handle may be invalid");
- break;
- case E_ACCESSDENIED:
- __DebugPrint(" Error: Access denied - monitor capture may be restricted");
- break;
- case DXGI_ERROR_UNSUPPORTED:
- __DebugPrint(" Error: Unsupported - monitor capture not supported");
- break;
- case E_NOINTERFACE:
- __DebugPrint(" Error: No interface - WGC may not be available on this system");
- break;
- default:
- __DebugPrint(" Error: Unknown error code");
- break;
- }
-
- return winrt::Windows::Graphics::Capture::GraphicsCaptureItem{nullptr};
- }
-
- __DebugPrint("CreateCaptureItemForMonitor: Successfully created capture item (HMONITOR=0x%p)", monitor);
- return item;
-
- } catch (const winrt::hresult_error& e) {
- __DebugPrint("CreateCaptureItemForMonitor: WinRT exception - HRESULT=0x%08lx, Message=%s (HMONITOR=0x%p)",
- static_cast<unsigned long>(e.code()),
- winrt::to_string(e.message()).c_str(),
- monitor);
- return winrt::Windows::Graphics::Capture::GraphicsCaptureItem{nullptr};
- } catch (const std::exception& e) {
- __DebugPrint("CreateCaptureItemForMonitor: Standard exception - %s (HMONITOR=0x%p)", e.what(), monitor);
- return winrt::Windows::Graphics::Capture::GraphicsCaptureItem{nullptr};
- } catch (...) {
- __DebugPrint("CreateCaptureItemForMonitor: Unknown exception (HMONITOR=0x%p)", monitor);
- return winrt::Windows::Graphics::Capture::GraphicsCaptureItem{nullptr};
- }
- }
|