Gafask

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

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

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

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

sazzas1978

Известный
134
127
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,122
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;
}
 

sazzas1978

Известный
134
127
Такое ощущение, что код писала нейросеть, ибо говно, почему бы не использовать опенцв?
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,122
989
Основная суть задачи была в поиске пикселей во всех программах, даже свернутых, у тебя - чисто на скриншоте, минус моего кода - что долго исполняется, так как нужно применить многопоточность для cpu bound
(Обновил свой код)
у тебя все потоки ща будут обращаться к хдс и хвнд окна, получаем крутые гонки данных, когда несколько потоков пытаются получить доступ к контексту и окну, почему ты не сделал это через мьютексы? в твоей ситуации, лучше мьютексы юзать, что бы была некая синхронизация доступа к общим файлам
 

sazzas1978

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