MacOS: CGWindowListCreateImage захватывает обои/за окном вместо видимого окна TradingView (Chrome), но щелчки мышью CGEvC#

Место общения программистов C#
Ответить
Anonymous
 MacOS: CGWindowListCreateImage захватывает обои/за окном вместо видимого окна TradingView (Chrome), но щелчки мышью CGEv

Сообщение Anonymous »

Я создаю настольное приложение для macOS (C#/.NET + Avalonia), которое:
  • Захватывает небольшую область экрана и проверяет цвета пикселей (обнаруживает зеленую/красную «панель сигнала»).
  • Если сигнал обнаруживается, он отправляет щелчок мышью в настроенную точку экрана покупки/продажи с помощью CoreGraphics события.
Что работает
  • Щелчки мыши происходят правильно, когда я публикую щелчок мыши CGEvent.
  • Это работает без какой-либо инверсии оси Y (что заставляет меня думать, что моя «система координат щелчка» уже правильная).
  • Приложение имеет разрешение специальных возможностей (для управления мышью) и разрешение записи экрана (для захвата экран).
Что не получается
Мой захват иногда возвращает изображение обоев/фона рабочего стола, как будто он захватывает то, что находится за видимым окном TradingView (Chrome), а не пиксели, которые видит пользователь.
Когда это происходит:
  • Моя выборка пикселей всегда сообщает об отсутствии сигнала, поскольку вместо сигнала выполняется выборка цветов обоев панель.
  • Это происходит даже тогда, когда Chrome/TradingView явно находится на переднем плане и виден на экране.
Почему я думаю, что это не просто проблема с переворотом по оси Y
Если бы это была только проблема с переворотом/смещением координат, я бы ожидал, что снимок покажет неправильную часть окна TradingView, а не рабочий стол за ним. Это заставляет меня задаться вопросом, вызвано ли это:
  • поведением разрешений macOS,
  • компоновкой окон или рендерингом с ускорением графического процессора в Chrome
  • или использованием неправильного API для «захвата того, что видит пользователь».
Это функция захвата. Прямоугольник представляет собой глобальные экранные координаты области, в которой отображается сигнальная панель.

Код: Выделить всё

// Rect is intended to be in global screen coordinates
var rect = new CGRect(x, y, width, height);

// Capture an on-screen image for that rect
using var img = CGWindowList.CreateImage(
rect,
CGWindowListOption.OnScreenOnly,
CGWindowID.Null,
CGWindowImageOption.Default
);

// Save debug image to confirm what was captured
if (img == null)
{
Console.WriteLine("Capture returned null");
}
else
{
SaveToPng(img, "debug.png");
}
Вопросы
  • При каких условиях CGWindowListCreateImage / CGWindowList.CreateImage(...) вернет рабочий стол/фон за видимыми окнами даже с OnScreenOnly?
  • Известно ли это ограничение для Chrome/контента с ускорением на графическом процессоре (TradingView), где Захват CoreGraphics не возвращает составные пиксели?
  • Каков современный подход к захвату реальных видимых пикселей экрана в macOS (например, следует ли вместо этого использовать ScreenCaptureKit)?
  • Если CGWindowListCreateImage может работать здесь, какие флаги/параметры или преобразования координат необходимы для этого надежный?
Окружающая среда: Apple Silicon Mac, один дисплей (при необходимости можно указать разрешение + сведения о нескольких мониторах).

Подробнее здесь: https://stackoverflow.com/questions/798 ... d-of-visib
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»