Problem z GetPixel w Windows 7

0

Napisałem sobie bota w MFC visual studio do pewnej gry i mam taki oto kod:

Funkcja getPixel poprawnie działała w windowsie xp, a przestała dzialać pod windows 7:

zapodam tutaj fragmenty kodów z róznych funkcji porgramu które współdziałają ze sobą:
\

 
CDC *dc;


//tutaj odwołuję się do ekranu pulpitu (całego ekranu monitora):
HWND wnd = ::GetDesktopWindow();		
HDC hdc = ::GetWindowDC(wnd);
dc->Attach(hdc);  
memDC.CreateCompatibleDC(dc);

//po wykonaniu takich operacji(zamknięciu i ponownym otwarciu pewnego okna explorera):
// TEXT("xxx")- co by nie zdradzać do jakiej gry jest ten bot.. otwarcie i zamkniecie działa poprawnie.. 
HWND hwnd = FindWindow(TEXT("IEFrame"), TEXT("xxx"));	SendMessage(hwnd,WM_CLOSE,NULL,NULL); 
Sleep(3500);
/* //kod bez znaczenia- odpowiada za klikniecie w odpowiednie miejsce by ponownie otworzyc okno gry
ImageSearch(uniwersalList,0,0,screenWIDTH,screenHEIGHT,startGamePicture,1,1,1);
uShort tmpx=0,tmpy=0;
uniwersalList->next(&tmpx,&tmpy);
mouseClick(tmpx+startGamePicture->Width/2,tmpy+startGamePicture->Height/2,false);
*/
Sleep(1000);
hwnd = FindWindow(TEXT("IEFrame"), TEXT("xxx"));
ShowWindow(hwnd,SW_SHOWMAXIMIZED);


//w taki sposób robie screena fragmentu ekranu do tablicy bmpBuffer:
memDC.BitBlt(start_i, start_j, end_i-start_i, end_j-start_j,dc, start_i, start_j, SRCCOPY);
DWORD dwvalue=memDC.GetCurrentBitmap()->GetBitmapBits(screenWIDTH*end_j*(bitDepth16?2:4),bmpBuffer);
        
// i,j - jakieś konkretne współrzędne ekranu.. 
// a tak pobieram pixele - odwołując się do tej samej zmiennej "dc" co funkcja BitBlt
//dc->GetPixel(i,j)
         

w windowsie xp wszytko działa poprawnie natomiast w windowsie 7 po zamknięciu i ponownym otwarciu okna przeglądarki funkcje do pobierania screenów z ekranu działają poprawnie a funkcja GetPixel zwraca czarne tło - czarne pixele tak jakby nic nie było..

nie wiem czy problem leży w tym że na xp-ku program kompilowałem pod visual studio 2008 a pod windowsem 7 w visual studio 2010

0

Funkcja getPixel w windowsie 7 zaczyna działać po otwarciu i zamknieciu okienka gry (przeglądarki) dopiero gdy ponownie zainicjalizuje zmienna dc (pobiorę kontekst urządzenia jeszcze raz).
Dlaczego bez ponizszego kodu funkjca bitblt działa, a get pixel nie działa??

HWND wnd = ::GetDesktopWindow();
HDC hdc = ::GetWindowDC(wnd);
dc->Attach(hdc); 
 
0

w win7 masz ten nowy WDDM 1.1, czego w XP nie ma
nie możesz oczekiwać że wszystko będzie idealnie kompatybilne, szczególnie że się trochę implementacja GDI między tymi modelami zmieniła...

0

nobody, a wiesz może co trzeba zmienić żeby działało na Win7? Bo ja mam taki sam problem jak kolega, tyle, że potrzebuję robić screeny nie moim grom.

0

Nigdzie nie znalazłem żadnych informacji na ten temat;/
Zaobserwowałem jedynie że po zamknieciu i otwarciu okna i po ponownym zainicjowaniu wskaźnika na ekran funkcja getPixel przestaje działać:
HDC hdc = ::GetWindowDC(NULL);
dc->Attach(hdc);
tzn że samoistnie jakieś powiązanie z tym obiektem tak jakby wygasa.. jedynym sposobem który udało mi sie znaleŹć na rozwiązanie tego problemu jest za każdym razem ponowna inicjalizacja tak jak podałem wyżej. Nie trzeba robic tego przed każdym użyciem funkcji getPixel np nie umieszczać tego w petli przed każdymwywołaniem funkcji getPixel tylko przed pętlą gdzie funkcja GetPixel jest wywolywana tak by ten obiekt byl regularnie odświerzany..

1 użytkowników online, w tym zalogowanych: 0, gości: 1