Создание скриншота из HWND из PID

#c #windows #screenshot

#c #Windows #скриншот

Вопрос:

В настоящее время я создаю способ делать скриншоты Windows. Прямо сейчас я указываю PID приложения, для которого я хочу сделать снимок экрана. Я получаю HWND, которые связаны с этим PID, используя эту функцию

 void GetAllWindowsFromProcessID(DWORD dwProcessID, std::vector <HWND> amp;vhWnds) {
    // find all hWnds (vhWnds) associated with a process id (dwProcessID)
    HWND hCurWnd = nullptr;
    do {
        hCurWnd = FindWindowEx(nullptr, hCurWnd, nullptr, nullptr);
        DWORD checkProcessID = 0;
        GetWindowThreadProcessId(hCurWnd, amp;checkProcessID);
        if (checkProcessID == dwProcessID) {
            vhWnds.push_back(hCurWnd);
        }
    } while (hCurWnd != nullptr);
}
  

Как только у меня есть вектор HWND, связанный с этим PID, я перебираю свой код скриншота и сохраняю скриншот каждого из них.

Когда я запускаю этот код с Notepad (PID 712) Я получаю 7 HWND, связанных с PID. Я проверил все 7 из них, и все они печатают черный экран, кроме последнего, который печатает Notepad . Если я попробую это в блокноте или калькуляторе, я просто получу черный экран.

Полный тестовый код, который я использую..

 snip
  

Комментарии:

1. Вы уверены, что ваш код скриншота в порядке? Можете ли вы запустить его с помощью HWND калькулятора, который вы получаете от Spy ? Изображение тоже черное?

2. Нашел его в программе Spy . Попытаюсь жестко закодировать этот дескриптор.

3. Есть команда «Найти окно», Ctrl F, со значком «перекрестие» в нем — просто перетащите его в нужное вам окно.

4. Хорошо, я только что попробовал это с помощью дескриптора калькулятора. Я знаю, что это изменило калькулятор, потому что я меняю непрозрачность окна. И я вижу, что он становится прозрачным, поэтому я знаю, что у меня правильный дескриптор. Но он не захватил SS. Затем я снова попытался использовать дескриптор Notepad , используя тот же метод, и это сработало.

5. Это как бы указывает на проблему с вашим кодом захвата экрана; похоже, он не может захватывать прозрачные окна?

Ответ №1:

Это еще не ответ (мне просто нужно опубликовать скриншот).

Вот что я вижу в Spy :

введите описание изображения здесь

Вы можете попробовать Windows.UI.Core.CoreWindow , например, дочернее окно.