тестирование экрана не соответствует ожиданиям (win32 c ++) - PullRequest
1 голос
/ 27 июня 2011

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

Программа набирает 7 баллов за наблюдение, и вы нажимаете клавишу shift, чтобы начать. Затем он должен щелкнуть любые пиксели рядом с цветом, который у меня есть в комментариях там над материалом RGB. Я пытался ослабить эти диапазоны, но заметил, что он щелкнул чем-то не того цвета. Когда я проследил значения цветов, которые он получал, я заметил, что многие из них были черными, что странно, потому что в переднем окне нет черных пикселей.

(я использую windows7, если это что-то значит)

Может кто-нибудь помочь мне понять, что происходит не так?

#include <iostream>
#include <Windows.h>
using namespace std;

void ClickAt(int x,int y){
    SetCursorPos( x, y );
    Sleep(10);
    mouse_event(MOUSEEVENTF_LEFTDOWN,0,0,0,0);
    Sleep(10);
    mouse_event(MOUSEEVENTF_LEFTUP,0,0,0,0);
    Sleep(10);
}

int absDist(int a,int b)
{
    int diff = a - b;
    if( diff<0 ) diff*=-1;
    return diff;
}

LPPOINT mouse;
POINT testPoints[7];

int main()
{
    mouse = new POINT;
    BYTE state=FALSE;
    BYTE prevState=FALSE;

    cout<< "Hello, let\'s get ready to play the game.\n";


    cout<< "Please provide your click-points by clicking them now.\n";

    int clicksFound = 0;

    while(true){
        state = (bool)GetAsyncKeyState(VK_LBUTTON);
        if(state!=prevState){
            prevState=(bool)state;
            if((bool)state != 0){
                // a click happened
                GetCursorPos(mouse);
                testPoints[clicksFound].x = mouse->x;
                testPoints[clicksFound].y = mouse->y;
            }else{
                clicksFound++;
                if( clicksFound>=7 ) 
                    break;
            }
        }
    }
    cout<< "\aGreat! Now press shift when you\'re ready to start.\n";
    cout<< "(You\'ll press space to quit.)\n";

    while(true)
    {
        if( (bool)GetAsyncKeyState(VK_SHIFT) )
            break;
    }

    cout<< "\aNow playing the game.\n";

    COLORREF myPixel;
    int r,g,b;

    while(true)
    {
        HDC scrn = GetDC(NULL);

        // R 225
        // G 141
        // B 35
        for(int i=0;i<7;i++)
        {
            myPixel = GetPixel(scrn,testPoints[i].x,testPoints[i].y);
            if( myPixel==CLR_INVALID )
                cout<< "invalid\n";


            r = GetRValue(myPixel);
            g = GetGValue(myPixel);
            b = GetBValue(myPixel);

            if( absDist(r,225)<20 && absDist(g,141)<20 && absDist(b,35)<20 )
            {
                cout<< "click\n";
                ClickAt(testPoints[i].x,testPoints[i].y);
            }
        }

        Sleep(20);

        if( (bool)GetAsyncKeyState(VK_SPACE) )
            break;

        ReleaseDC(NULL,scrn);
    }

    cout<< "\aThank you for playing the game.\n";

    system("pause");

    return 0;
}

Ответы [ 2 ]

0 голосов
/ 09 июля 2011

Если другая программа не использует GDI для рисования на экране (большинство игр используют Direct3D или OpenGL), то вы не можете читать пиксели таким образом.

Этот ответ может вам помочь: Сделайте снимок экрана полноэкранного приложения DirectX

0 голосов
/ 09 июля 2011

Я ошибаюсь или ReleaseDC (NULL, scrn);не освобождается, потому что эта строка находится после «разрыва» в цикле.

...