Visualizzazione dei risultati da 1 a 6 su 6
  1. #1

    [c] rilevare colore pixel !!

    ciao a tutti... volevo sapere se conoscete un modo per rilevare il colore di un pixel date le rispettive coordinate??
    cercando su internet ho trovato il seguente codiche ...
    codice:
    #include <windows.h>
    #include <string.h>
    #include <stdio.h>
    #include <stdlib.h>
    
    int main()
    {
        POINT mouse; //definizione necessaria per il mouse
        /*ho creato in paint 3 rettangoli pieni uno nero uno blu e uno verde*/
        HWND hwnd = FindWindow(NULL,"Immagine - Paint"); 
        SetForegroundWindow(hwnd);
        Sleep(1000); //aspetto un po
        HDC hdc = GetDC(hwnd);
        GetCursorPos(&mouse);//posizione mouse
        printf("pos x=%ld\ty=%ld\n",mouse.x,mouse.y);
    
        COLORREF col = GetPixel(hwnd,mouse.x,mouse.y);
    
        printf("rosso:%d\nverde:%d\nblu:%d\n",getRValue(col),GetGValue(col),GetBValue(col));
        ReleaseDC(hwnd,hdc);
    
    return 0;
    }
    problema... mi restituisce sempre 255 255 255 che è il bianco... leggendo in giro ho visto che il problema è dovuto al CLR_INVALID cioe il pixel che mi interessa è fuori dalla regione di ritaglio corrente...

    che vuole dire??? che la finesta dove è il pixel che voglio non è quella che gli passo io nella getDC???
    come posso risolvere il problema??

  2. #2
    1. Le coordinate del DC non sono le coordinate-schermo, devi fare una conversione da coordinate-schermo a coordinate-client (ScreenToClient);
    2. Stai passando a GetPixel l'handle di finestra invece dell'handle al DC, ovviamente non può funzionare.

    Comunque se volessi fare una cosa del genere lascerei stare la ricerca della finestra specifica, crea un DC relativo all'area di tutti gli schermi (CreateDC(TEXT("DISPLAY"),NULL,NULL,NULL)) e usa direttamente quello (e ti eviti anche la conversione di coordinate).

    In ogni caso, se non hai mai fatto programmazione con WinAPI ti consiglio di leggerti prima un libro in proposito.
    Amaro C++, il gusto pieno dell'undefined behavior.

  3. #3
    ok grazie mille della risposta...
    usando CreateDC(TEXT("DISPLAY"),NULL,NULL,NULL)
    ho risolto tutto...
    un'ultima cosa... ho letto che cosa fa la funzione ma non sono sicuro di aver capito bene..
    in pratica mi fornisce "l'indirizzo" del desktop vedendolo come una unica finestra...
    giusto??

    altro dubbio... nel codice devo inserire ReleaseDC() o diventa inutile?? e siccome devo fare un controllo periodico del pixel questa funzione mi intasa la memoria o la cpu?

  4. #4
    Originariamente inviato da indovinello
    ok grazie mille della risposta...
    usando CreateDC(TEXT("DISPLAY"),NULL,NULL,NULL)
    ho risolto tutto...
    un'ultima cosa... ho letto che cosa fa la funzione ma non sono sicuro di aver capito bene..
    in pratica mi fornisce "l'indirizzo" del desktop vedendolo come una unica finestra...
    giusto??
    Ti fornisce un device context "complessivo" di tutti gli schermi. (un device context è un'astrazione di dispositivo su cui si può disegnare; per ulteriori informazioni a proposito, ti rimando alla documentazione, o come detto prima, ad un libro di programmazione Win32)
    altro dubbio... nel codice devo inserire ReleaseDC() o diventa inutile??
    Devi usare DeleteDC, come spiegato nella documentazione:
    When you no longer need the DC, call the DeleteDC function.
    In generale,
    GetDC->ReleaseDC
    CreateDC->DeleteDC
    e siccome devo fare un controllo periodico del pixel questa funzione mi intasa la memoria o la cpu?
    Non particolarmente, magari evita di continuare a creare e cancellare il DC (crealo all'avvio del programma e eliminalo alla chiusura).
    Amaro C++, il gusto pieno dell'undefined behavior.

  5. #5
    ok grazie... ora ho risolto e funziona alla grande!!!

    ultima cosa... se io volessi in un qualunque momento rilevare la pressione del tasto f come posso fare??

    esempio
    codice:
    int main
    {
    int a,b,c,v;
    char r,tyy;
    //altre variabili
    
    for()
    {
    //fa quello che deve fare
    }
    
    while (1==1)
    {
    //simulo pressione tasti
    keybd_event('c', 0, 0, 0 ); 
    keybd_event('c', 0, KEYEVENTF_KEYUP, 0 ); 
    keybd_event('i', 0, 0, 0 ); 
    keybd_event('i', 0, KEYEVENTF_KEYUP, 0 );
    keybd_event('a', 0, 0, 0 ); 
    keybd_event('a', 0, KEYEVENTF_KEYUP, 0 );
    keybd_event('o', 0, 0, 0 ); 
    keybd_event('o', 0, KEYEVENTF_KEYUP, 0 );
    
    /*-----altri cicli vari-----*/
    Sleep (2000); //aspetto 2 secondi
    }
    
    }
    eseguendo questo codice a un certo punto voglio smettere e premo f e lui termina... so che per rilevare la pressione di un tasto devo usare GetAsyncKeyState(valore ascii tasto)
    pero dove lo metto, all'interno di ogni ciclo??? puo essere che entri in conflitto con la keybd_event??

  6. #6
    Altro problema -> altro thread.
    Amaro C++, il gusto pieno dell'undefined behavior.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.