Попытка прочитать GetPixel () в точке мыши, всегда возвращает 4294967 - Наличие растрового изображения и области отсечения - PullRequest
0 голосов
/ 04 апреля 2020

Я пытаюсь создать программу, которая считывает цвет пикселя в определенный момент. Я думаю, что мне удалось настроить область отсечения и растровое изображение для моей игры, но я просто не могу сказать, почему она не работает.

using namespace std;

int main() {
    while (true) {
        LPCWSTR window_title = L"World of Warcraft";
        HWND hWND = FindWindow(NULL, window_title);
        RECT rWindow;
        RECT rClient;

        HRGN hRgnWindow;
        HRGN hRgnClient;
        HRGN hNCRgn;

        //C: Get the window and client rectangles for the window.
        GetWindowRect(hWND, &rWindow);
        GetClientRect(hWND, &rClient);

        //C: Translate the Client rectangle into screen coordinates.
        POINT p = { 0,0 };
        MapWindowPoints(hWND, NULL, &p, 1);
        OffsetRect(&rClient, p.x, p.y);

        //C: Create regions from these two rectangles.
        hRgnWindow = ::CreateRectRgnIndirect(&rWindow);
        hRgnClient = ::CreateRectRgnIndirect(&rClient);
        hNCRgn = ::CreateRectRgn(0, 0, 0, 0);

        //C: Subtract the client region from the window region.
        CombineRgn(hNCRgn, hRgnWindow, hRgnClient, RGN_DIFF);

        while (hWND == NULL) {
            hWND = FindWindowA(NULL, "World of Warcraft");
            cout << "start game!" << endl;
            Sleep(1000);
        }
        Sleep(10);
        if (GetAsyncKeyState(VK_SHIFT)) { // MousePosition
            //HDC hDC = GetDC(hWND); 
            POINT p;
            GetCursorPos(&p);
            ScreenToClient(hWND, &p); // actually only needs window title not HDC but will need for color
            //ReleaseDC(hWND, hDC);
            cout << "(" << p.x << ","<< p.y << ")" << endl;
            Sleep(1000);
        }
        Sleep(10);
        if (GetAsyncKeyState(VK_LBUTTON)) { // pixelColor
            HDC hDC, hCDC;
            HBITMAP hbwin;
            HRGN RrGN = CreateRectRgn(30, 5, 1277, 690);
            int height, width;
            hDC = GetDC(hWND);
            hCDC = CreateCompatibleDC(hDC);
            SetStretchBltMode(hCDC, COLORONCOLOR);

            RECT winsize;
            GetClientRect(hWND, &winsize);
            SetWindowRgn(hWND, RrGN, TRUE);
            SelectClipRgn(hDC, RrGN);
            GetClipRgn(hDC, RrGN);

            POINT p;
            GetCursorPos(&p);
            ScreenToClient(hWND, &p);

            hbwin = CreateCompatibleBitmap(hDC, p.x, p.y);
            SelectObject(hCDC, hbwin);

            COLORREF color = GetPixel(hCDC, p.x, p.y);

            cout << " | Color: " << color << endl;
                /*cout<<  //"(" << p.x << "," << p.y << ")" << " R: " << (int)GetRValue(color) 
                << " | G: " << (int)GetGValue(color) << " | B: "
                << (int)GetBValue(color) << endl;
            BOOL EndPaint(hWND, CONST PAINTSTRUCT * lp);*/
            Sleep(10);
            cout << " | Color: " << color << endl;
            DeleteObject(hbwin);
            DeleteDC(hCDC);
            ReleaseDC(hWND, hDC);
            DeleteObject(RrGN);
            Sleep(1000);
        }
        /*if (GetAsyncKeyState(VK_CONTROL)) {
            HDC hDC = GetDC(hWND);
            COLORREF color;                     //could have the choice of which zone or 
            COLORREF characteristic_ color = ; //color of fishing bobber? --> How to find in different zones
            Sleep(1000);
        }*/
        if (GetAsyncKeyState(VK_MENU)) { // Exit Game
            return 0;
        }
        DeleteObject(hRgnWindow);
        DeleteObject(hRgnClient);
        DeleteObject(hNCRgn);
    }
    return 0;
}

IInspectable прокомментировал, что CreateCompatibleBitmap () делает пустое растровое изображение, но тогда как мне заставить его брать пиксели из окна? Я пытался сделать это, но я не могу понять это! Спасибо за любую помощь!

1 Ответ

0 голосов
/ 22 апреля 2020

Полное возвращаемое значение равно 4294967295‬ в шестнадцатеричном формате "0xffffffff" (CLR_INVALID). В качестве комментариев, звоните CreateCompatibleBitmap только для создания пустого растрового изображения, и вам нужно будет скопировать содержимое из hDC в hCDC.

    hbwin = CreateCompatibleBitmap(hDC, rClient.right- rClient.left, rClient.bottom - rClient.top);
    SelectObject(hCDC, hbwin);

    BitBlt(hCDC, 0, 0, rClient.right - rClient.left, rClient.bottom - rClient.top, hDC, 0, 0, SRCCOPY);
    COLORREF color = GetPixel(hCDC, p.x, p.y);

    cout << " | Color: " << color << endl;
    cout << " | Color: " << color << endl;

Кроме того, используя GetDIBits может быть быстрее, чем использовать GetPixel Вы можете обратиться к примеру на MSDN:

Захват изображения

и этот вопрос:

GetDIBits и l oop через пиксели, используя X, Y

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...