Gafask

Участник
Автор темы
137
13
Добрый день или ночь!🤌

Я хочу узнать о наличии библиотек на C++🧐, которые могут захватывать цвет пикселей даже из неактивных областей экрана. Другими словами, мне интересны библиотеки, которые могут получать информацию о цветах пикселей даже в тех окнах или областях экрана, которые находятся на заднем плане, и даже если поверх них запущены другие приложения. Примерами таких программ могут быть OBS и Fraps.

Заранее благодарю за помощь и рекомендации по этому вопросу!

🤡😶‍🌫️😶‍🌫️😶‍🌫️👾
Да чё там, брат? Как дела, доброй ночи или чего? Слышь, кто-нибудь в курсе, где можно взять какие-то крутые библиотеки на C++, чтоб они, типа, цвета пикселей с экрана хватали? Да не просто так, а чтоб даже из тех окон, что неактивные, понимаешь? Чтоб они фигачили цвета пикселей, даже если вон сверху другие приложухи нафигачили.
👾😶‍🌫️😶‍🌫️😶‍🌫️🤡
 
D

deleted-user-218011

Гость
C++:
#include <iostream>
#include <Windows.h>
#include <vector>
#include <thread>

int targetColor = RGB(255, 255, 255); // Target color 

void CheckWindow(HWND hwnd) {
    HDC hdc = GetDC(hwnd);
    RECT rect;
    GetClientRect(hwnd, &rect);

    for (int x = rect.left; x < rect.right; x += 10) {
        for (int y = rect.top; y < rect.bottom; y += 10) {
            COLORREF pixelColor = GetPixel(hdc, x, y);

            if (pixelColor == targetColor) {
                char windowTitle[256];
                GetWindowText(hwnd, windowTitle, sizeof(windowTitle));
                std::cout << "Window Title: " << windowTitle << std::endl;
            }
        }
    }

    ReleaseDC(hwnd, hdc);
}

int main() {
    std::vector<std::thread> threads;

    HWND hwnd = GetTopWindow(NULL);

    while (hwnd != NULL) {
        threads.emplace_back(CheckWindow, hwnd);
        hwnd = GetNextWindow(hwnd, GW_HWNDNEXT);
    }

    for (auto& thread : threads) {
        thread.join();
    }

    return 0;
}
 
Последнее редактирование модератором:
  • Эм
Реакции: kin4stat

Digger Man52

52NGG
1,113
989
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
C++:
#include <iostream>

#include <windows.h>



int main() {

    int targetColor = RGB(255, 0, 0); // Целевой цвет (красный в данном случае)



    HWND hwnd = GetTopWindow(NULL);



    while (hwnd != NULL) {

 

        HDC hdc = GetDC(hwnd);





        RECT rect;

        GetClientRect(hwnd, &rect);



        // Перебор всех пикселей в окне

        for (int x = rect.left; x < rect.right; x++) {

            for (int y = rect.top; y < rect.bottom; y++) {

                COLORREF pixelColor = GetPixel(hdc, x, y);



                if (pixelColor == targetColor) {

                    std::cout << "Цвет пикселя совпал с целевым цветом в окне: " << hwnd << std::endl;

                }

            }

        }



        ReleaseDC(hwnd, hdc);



        hwnd = GetNextWindow(hwnd, GW_HWNDNEXT);

    }



    return 0;

}
Такое ощущение, что код писала нейросеть, ибо говно, почему бы не использовать опенцв?
C++:
#include <iostream>
#include <opencv2/opencv.hpp>
int main(){
// короче для работы с опенцв
// нужно ему скрин экрана пихнуть
// это на винапи можно сделать
// потом короче нужно передать картинку в прогу
cv::Mat screen =  cv::imread("screenshot.png"); 
cv::Vec3b target(0, 0, 255);
// тут можно вьебать цикл
// который будет перебирать каждый х и y экрана,
// и проверять каждый пиксель, равен ли он нашему значению
// x и y достаются из нашего материала
// типо screen.cols - x
// screen.rows - y
// я пишу это с телефона, поэтому да,
// не буду ниче лишнего писать
cv::Vec3b PIXELCVET = screen.at<cv::Vec3b>(y, x);
// и короче тут в этом цикле сразу сверяем
if (PIXELCVET == target) {
                std::cout << x << y << std::endl;
        
}
return 0;
}
 
D

deleted-user-218011

Гость
Такое ощущение, что код писала нейросеть, ибо говно, почему бы не использовать опенцв?
C++:
#include <iostream>
#include <opencv2/opencv.hpp>
int main(){
// короче для работы с опенцв
// нужно ему скрин экрана пихнуть
// это на винапи можно сделать
// потом короче нужно передать картинку в прогу
cv::Mat screen =  cv::imread("screenshot.png");
cv::Vec3b target(0, 0, 255);
// тут можно вьебать цикл
// который будет перебирать каждый х и y экрана,
// и проверять каждый пиксель, равен ли он нашему значению
// x и y достаются из нашего материала
// типо screen.cols - x
// screen.rows - y
// я пишу это с телефона, поэтому да,
// не буду ниче лишнего писать
cv::Vec3b PIXELCVET = screen.at<cv::Vec3b>(y, x);
// и короче тут в этом цикле сразу сверяем
if (PIXELCVET == target) {
                std::cout << x << y << std::endl;
      
}
return 0;
}
Основная суть задачи была в поиске пикселей во всех программах, даже свернутых, у тебя - чисто на скриншоте, минус моего кода - что долго исполняется, так как нужно применить многопоточность для cpu bound
(Обновил свой код)
 

Digger Man52

52NGG
1,113
989
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Основная суть задачи была в поиске пикселей во всех программах, даже свернутых, у тебя - чисто на скриншоте, минус моего кода - что долго исполняется, так как нужно применить многопоточность для cpu bound
(Обновил свой код)
у тебя все потоки ща будут обращаться к хдс и хвнд окна, получаем крутые гонки данных, когда несколько потоков пытаются получить доступ к контексту и окну, почему ты не сделал это через мьютексы? в твоей ситуации, лучше мьютексы юзать, что бы была некая синхронизация доступа к общим файлам
 
D

deleted-user-218011

Гость
у тебя все потоки ща будут обращаться к хдс и хвнд окна, получаем крутые гонки данных, когда несколько потоков пытаются получить доступ к контексту и окну, почему ты не сделал это через мьютексы? в твоей ситуации, лучше мьютексы юзать, что бы была некая синхронизация доступа к общим файлам
Нет, так как потоки создаются изначально в главном одном потоке, потому этого не будет, единственное есть доступ общий к TargetColor, но он не изменяется, так что впринципе все равно.