Accueil > > > [WIN32]RÉCUPÉRER LA COULEUR D'UN PIXEL À L'ÉCRAN
[WIN32]RÉCUPÉRER LA COULEUR D'UN PIXEL À L'ÉCRAN
Information sur la source
Description
Ce source récupère la couleur du pixel qui se trouve sous la souris. La couleur est affiché en décimal R, G, B et en hexa. Le fond de la form prend la même couleur que celle du pixel. Pour ceux qui voudraient juste utiliser ce programme sans avoir besoin de compiler, il suffit de renommer le fichier du zip .exec en .exe.
Source
- #include "windows.h"
-
- HINSTANCE _hThisInstance; // Handle du module
- HWND _hWnd; // Handle de la fenêtre
- HWND _hTextBox; // Handle de la textbox
- LPSTR _lpAppName = "GetPixelColor"; // Nom de l'appli
-
- //
- // Affiche le message d'erreur associé à la dernière
- // erreur Win32.
- //
- void ShowLastError()
- {
- DWORD nLastError;
- LPSTR lpMessageBuffer;
-
- // Récupération du numéro de l'erreur
- nLastError = GetLastError();
-
- // Formatage du message
- FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM, NULL, nLastError, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPTSTR) &lpMessageBuffer, 0, NULL);
-
- // Affichage du message et fin de l'appli
- MessageBox(NULL, lpMessageBuffer, "ERROR", MB_OK | MB_ICONERROR);
-
- LocalFree(lpMessageBuffer);
- }
-
- //
- // Traitement des messages.
- //
- LRESULT CALLBACK WindowProcedure(HWND hWnd, UINT nMessage, WPARAM wParam, LPARAM lParam)
- {
- static HBRUSH hBackBrush; // Brush de dessin de l'arrière plan de la fenêtre
- static POINT cursor; // Position de la souris
- static COLORREF nColor; // Couleur du pixel sous la souris
- static RECT back; // Rectangle de la zone cliente/fenêtre
- static char lpText[50]; // Affichage de la couleur en hexa et rgb
- static INT32 nHexa; // La couleur swapée pour afficher un hexa comme on l'attend
- static HDC hScreenDC; // HDC de l'écran
-
- switch (nMessage)
- {
- case WM_TIMER:
- // On met à jour seulement si on est hors de notre fenêtre
- GetCursorPos(&cursor);
- GetWindowRect(_hWnd, &back);
-
- // Pas besoin de ReleasDC pour ce GetDC : CS_OWNDC dans le style de la classe
- if (! PtInRect(&back, cursor)) SendMessage(_hWnd, WM_ERASEBKGND, (WPARAM)GetDC(_hWnd), 0);
- break;
- case WM_ERASEBKGND:
- // Récupération des coordonnées de la souris
- GetCursorPos(&cursor);
-
- // Récupération de la couleure du pixel sous la souris
- hScreenDC = GetDC(0);
- nColor = GetPixel(hScreenDC, cursor.x, cursor.y);
- nHexa = ReleaseDC(0, hScreenDC);
-
- // Création du brush de dessin de l'arrière plan de la form
- hBackBrush = CreateSolidBrush(nColor);
-
- // Dessin de la fenêtre
- GetClientRect(_hWnd, &back);
- FillRect((HDC)wParam, &back, hBackBrush);
- DeleteObject(hBackBrush);
-
- // On remet les octets dans le "bon" sens
- nHexa = ((nColor & 0xFF) << 16) | (nColor & 0xFF00) | ((nColor & 0xFF0000) >> 16);
-
- // Affichage de la couleur en hexa
- // Le dièze, c'est juste qu'en HTML on en met un.
- // %X, ça convertit l'entier en hexa (En majuscule)
- // %6X, ça complète la conversion avec des espaces pour que la chaîne fasse 6 caractères
- // %06X, ça demande des 0 à la place des espaces pour arriver à 6 caractères
- wsprintf(lpText, "#%06X (R = %d, G = %d, B = %d)", nHexa, nColor & 0xFF, (nColor & 0xFF00) >> 8, (nColor & 0xFF0000) >> 16);
- SetWindowText(_hTextBox, lpText);
- RedrawWindow(_hTextBox, NULL, NULL, RDW_INVALIDATE);
- return 1;
- case WM_DESTROY:
- // On signale que le thread va s'arrêter
- PostQuitMessage(0);
- break;
- default:
- // Application du traitement par défaut
- return DefWindowProc(hWnd, nMessage, wParam, lParam);
- }
- return 0;
- }
-
- //
- // Initialise la fenêtre principale de l'appli.
- //
- void InitWindow()
- {
- WNDCLASSEX wincl; // Classe de la fenêtre utilisée
-
- // Création de la classe de fenêtre
- wincl.cbSize = sizeof(WNDCLASSEX);
- wincl.style = CS_OWNDC;
- wincl.lpfnWndProc = WindowProcedure;
- wincl.cbClsExtra = 0;
- wincl.cbWndExtra = 0;
- wincl.hInstance = _hThisInstance;
- wincl.hIcon = LoadIcon(NULL, IDI_APPLICATION);
- wincl.hCursor = LoadCursor(NULL, IDC_ARROW);
- wincl.hbrBackground = NULL;
- wincl.lpszMenuName = 0;
- wincl.lpszClassName = _lpAppName;
- wincl.hIconSm = NULL;
-
- // Enregistrement de la classe
- if (!RegisterClassEx(&wincl)) ShowLastError();
-
- // Création de la fenêtre
- _hWnd = CreateWindowEx(0, _lpAppName, _lpAppName, WS_OVERLAPPED | WS_SYSMENU | WS_MINIMIZEBOX | WS_VISIBLE, CW_USEDEFAULT, CW_USEDEFAULT, 300, 100, HWND_DESKTOP, NULL, _hThisInstance, NULL);
- _hTextBox = CreateWindowEx(0, "EDIT", "color", ES_READONLY | WS_VISIBLE | WS_CHILD | WS_BORDER, 0, 0, 294, 20, _hWnd, NULL, _hThisInstance, NULL);
- }
-
- #pragma comment(linker, "/entry:main")
- INT32 _cdecl main()
- {
- MSG messages; // Réception des messages envoyés à l'application
-
- // Récupération du handle du module
- _hThisInstance = GetModuleHandle(NULL);
-
- InitWindow();
- if (!SetTimer(_hWnd, 1, 100, NULL)) ShowLastError();
-
- // Boucle de traitement des messages
- while (GetMessage(&messages, NULL, 0, 0))
- {
- // Traduit certains messages
- TranslateMessage(&messages);
-
- // Distribution des messages aux fenêtres
- DispatchMessage(&messages);
- }
- KillTimer(_hWnd, 1);
-
- // Code d'erreur en sortie
- return messages.wParam;
- }
#include "windows.h"
HINSTANCE _hThisInstance; // Handle du module
HWND _hWnd; // Handle de la fenêtre
HWND _hTextBox; // Handle de la textbox
LPSTR _lpAppName = "GetPixelColor"; // Nom de l'appli
//
// Affiche le message d'erreur associé à la dernière
// erreur Win32.
//
void ShowLastError()
{
DWORD nLastError;
LPSTR lpMessageBuffer;
// Récupération du numéro de l'erreur
nLastError = GetLastError();
// Formatage du message
FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM, NULL, nLastError, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPTSTR) &lpMessageBuffer, 0, NULL);
// Affichage du message et fin de l'appli
MessageBox(NULL, lpMessageBuffer, "ERROR", MB_OK | MB_ICONERROR);
LocalFree(lpMessageBuffer);
}
//
// Traitement des messages.
//
LRESULT CALLBACK WindowProcedure(HWND hWnd, UINT nMessage, WPARAM wParam, LPARAM lParam)
{
static HBRUSH hBackBrush; // Brush de dessin de l'arrière plan de la fenêtre
static POINT cursor; // Position de la souris
static COLORREF nColor; // Couleur du pixel sous la souris
static RECT back; // Rectangle de la zone cliente/fenêtre
static char lpText[50]; // Affichage de la couleur en hexa et rgb
static INT32 nHexa; // La couleur swapée pour afficher un hexa comme on l'attend
static HDC hScreenDC; // HDC de l'écran
switch (nMessage)
{
case WM_TIMER:
// On met à jour seulement si on est hors de notre fenêtre
GetCursorPos(&cursor);
GetWindowRect(_hWnd, &back);
// Pas besoin de ReleasDC pour ce GetDC : CS_OWNDC dans le style de la classe
if (! PtInRect(&back, cursor)) SendMessage(_hWnd, WM_ERASEBKGND, (WPARAM)GetDC(_hWnd), 0);
break;
case WM_ERASEBKGND:
// Récupération des coordonnées de la souris
GetCursorPos(&cursor);
// Récupération de la couleure du pixel sous la souris
hScreenDC = GetDC(0);
nColor = GetPixel(hScreenDC, cursor.x, cursor.y);
nHexa = ReleaseDC(0, hScreenDC);
// Création du brush de dessin de l'arrière plan de la form
hBackBrush = CreateSolidBrush(nColor);
// Dessin de la fenêtre
GetClientRect(_hWnd, &back);
FillRect((HDC)wParam, &back, hBackBrush);
DeleteObject(hBackBrush);
// On remet les octets dans le "bon" sens
nHexa = ((nColor & 0xFF) << 16) | (nColor & 0xFF00) | ((nColor & 0xFF0000) >> 16);
// Affichage de la couleur en hexa
// Le dièze, c'est juste qu'en HTML on en met un.
// %X, ça convertit l'entier en hexa (En majuscule)
// %6X, ça complète la conversion avec des espaces pour que la chaîne fasse 6 caractères
// %06X, ça demande des 0 à la place des espaces pour arriver à 6 caractères
wsprintf(lpText, "#%06X (R = %d, G = %d, B = %d)", nHexa, nColor & 0xFF, (nColor & 0xFF00) >> 8, (nColor & 0xFF0000) >> 16);
SetWindowText(_hTextBox, lpText);
RedrawWindow(_hTextBox, NULL, NULL, RDW_INVALIDATE);
return 1;
case WM_DESTROY:
// On signale que le thread va s'arrêter
PostQuitMessage(0);
break;
default:
// Application du traitement par défaut
return DefWindowProc(hWnd, nMessage, wParam, lParam);
}
return 0;
}
//
// Initialise la fenêtre principale de l'appli.
//
void InitWindow()
{
WNDCLASSEX wincl; // Classe de la fenêtre utilisée
// Création de la classe de fenêtre
wincl.cbSize = sizeof(WNDCLASSEX);
wincl.style = CS_OWNDC;
wincl.lpfnWndProc = WindowProcedure;
wincl.cbClsExtra = 0;
wincl.cbWndExtra = 0;
wincl.hInstance = _hThisInstance;
wincl.hIcon = LoadIcon(NULL, IDI_APPLICATION);
wincl.hCursor = LoadCursor(NULL, IDC_ARROW);
wincl.hbrBackground = NULL;
wincl.lpszMenuName = 0;
wincl.lpszClassName = _lpAppName;
wincl.hIconSm = NULL;
// Enregistrement de la classe
if (!RegisterClassEx(&wincl)) ShowLastError();
// Création de la fenêtre
_hWnd = CreateWindowEx(0, _lpAppName, _lpAppName, WS_OVERLAPPED | WS_SYSMENU | WS_MINIMIZEBOX | WS_VISIBLE, CW_USEDEFAULT, CW_USEDEFAULT, 300, 100, HWND_DESKTOP, NULL, _hThisInstance, NULL);
_hTextBox = CreateWindowEx(0, "EDIT", "color", ES_READONLY | WS_VISIBLE | WS_CHILD | WS_BORDER, 0, 0, 294, 20, _hWnd, NULL, _hThisInstance, NULL);
}
#pragma comment(linker, "/entry:main")
INT32 _cdecl main()
{
MSG messages; // Réception des messages envoyés à l'application
// Récupération du handle du module
_hThisInstance = GetModuleHandle(NULL);
InitWindow();
if (!SetTimer(_hWnd, 1, 100, NULL)) ShowLastError();
// Boucle de traitement des messages
while (GetMessage(&messages, NULL, 0, 0))
{
// Traduit certains messages
TranslateMessage(&messages);
// Distribution des messages aux fenêtres
DispatchMessage(&messages);
}
KillTimer(_hWnd, 1);
// Code d'erreur en sortie
return messages.wParam;
}
Historique
- 15 novembre 2007 10:01:36 :
- Modifes suggérées par les premiers posts.
- 15 novembre 2007 10:05:12 :
- Bout de code en trop.
- 21 novembre 2007 10:02:30 :
- Confusion entre le style de classe et le style de fenêtre.
- 21 novembre 2007 10:05:58 :
- Argh !
- 21 novembre 2007 13:00:54 :
- La dernière MAJ... avant la suivante.
- 23 décembre 2008 15:13:50 :
- Manquait LocalFree dans ShowLastError.
Sources du même auteur
Sources de la même categorie
Commentaires et avis
Discussions en rapport avec ce code source dans le forum
Récupérer la couleur d'un pixel à la position x,y de l'écran [ par atao ]
quelqu' un sait il comment peut on récupérer la couleur d'un pixel à la position x,y de l'écranmerciatao.
[Visual C++] Couleur d'un pixel [ par kesakoa ]
Bonjour.Je veux automatiser des taches suivant ce que l'écran affiche : j'ai besoin de pouvoir tester la couleur de certains pixels de l'écran. (je ne
Couleur d'un pixel / Hotkey fonctions [ par Derto ]
Bonjours. Quelqu'un aurait t'il la solution pour appeler une fonction grace à une touche de raccourci ? Et j'aimerai aussi savoir si il existe une f
Avoir la couleur d'un pixel [ par Bouba le koala ]
Comment fait-on pour récupérer la couleur d'un pixel d'une page internet avec C++ Builder ?Ma syntaxe ne me donne que la couleur du fond de la fenêtre
Couleur d'un Pixel et dessin [ par wxccxw ]
Bonjour,je suis en train de faire un colorimètre numérique, et lorsque que je recupere la couleur des pixels a la place de mon pointeur j'obtien toujo
Couleur d'un pixel api win [ par Derto ]
<span class="Apple-style-span" style="border-collapse: separate; color: rgb(0, 0, 0); font-family: -webkit-monospace; font-size: 13px; font-style: nor
Chercher un pixel de couleur précise. [ par krokro6 ]
Salut à tous, j'aurai besoin d'aide pour chercher dans l'écran un pixel d'une couleur spécifiée et ensuite pointer la souris dessus mais je ne sais vr
récupération de la couleur d'un pixel [ par njo80 ]
Bonjour,Je suis en train de créer un petit jeu style zelda (en light), j'ai affiché ma carte ainsi que mon sprite qui bouge.Pour gérer la collision j'
Recuperer la Couleur d'un Pixel dans une fenetre. [ par nomlingote ]
Bonjour à tous, Est il possible de connaitre la couleur d'un pixel dans une fenetre (dont on connait le handle ) ou sur l'ensemble de l'ecran. J'ai es
erreur couleur pixel [ par DJtef ]
Je cherche à récupérer les coordonnées et la couleur du pixel pointé par la souris, dans une simple console dos, sous Dev C++, mais j'ai les 2 message
|
Derniers Blogs
[WP7] DYNAMICALLY CHANGE STARTUP PAGE[WP7] DYNAMICALLY CHANGE STARTUP PAGE par KooKiz
Let's say that you want to allow the user to customize the startup page of your application. You can easily change the startup page by editing the 'NavigationPage' attribute in the manifest file. But the manifest cannot be modified once the applicatio...
Cliquez pour lire la suite de l'article par KooKiz SESSION SILVERLIGHT 5 3D : SLIDES ET DEMOSSESSION SILVERLIGHT 5 3D : SLIDES ET DEMOS par Groc
Durant les techdays, j'ai eu le plaisir d'animer une session sur Silverlight 5 et la 3D avec Simon Ferquel. Comme promis, voici nos slides et mes démos (celles avec le viper BSG) ici et là. Pour mémoire, les démos utilisent toutes le viper BSG...
Cliquez pour lire la suite de l'article par Groc [TECHDAYS 2012] SESSION WEBMATRIX 2 : LE COUTEAU SUISSE GRATUIT POUR VOS DéVELOPPEMENTS WEB - SLIDES[TECHDAYS 2012] SESSION WEBMATRIX 2 : LE COUTEAU SUISSE GRATUIT POUR VOS DéVELOPPEMENTS WEB - SLIDES par gpommier
Suite à la session que j'ai présenté sur WebMatrix 2, vous pouvez trouver les slides ici, ainsi que les démos en packages nuget : démos1 et démos2 J'en profite pour remercier chaleureusement tous ceux qui sont venus très nombreux à cette sess...
Cliquez pour lire la suite de l'article par gpommier [SHAREPOINT] LES SESSIONS TECHDAYS 2012.[SHAREPOINT] LES SESSIONS TECHDAYS 2012. par Patrick Guimonet
Voici donc pour ceux qui n'ont pas pu venir, ou ceux qui n'ont pas pu toutes les suivre la liste des sessions SharePoint aux TechDays 2012, que je mettrais à jour dès que les liens des vidéo seront disponibles. Ou ici : http...
Cliquez pour lire la suite de l'article par Patrick Guimonet TECHDAYS PARIS 2012 : SESSION PLEINIèRE JOUR 3TECHDAYS PARIS 2012 : SESSION PLEINIèRE JOUR 3 par ROMELARD Fabrice
Speaker: Bernard Ourghanlian Cette session est comme chaque jour transmise en live par BrainSonic, et j'ai donc suivi cette troisième pleinière par ce moyen sur mon iPad . Elle est dédiée comme chaque année à la mise en perspective de l'é...
Cliquez pour lire la suite de l'article par ROMELARD Fabrice
Logiciels
Tribler (2012)TRIBLER (2012)Tribler est un client pair à pair (P2P/Peer-to-Peer) open source avec la capacité de regarder des... Cliquez pour télécharger Tribler OneSwarm (2012)ONESWARM (2012)Le peer-to-peer qui protège votre vie privée, c'est OneSwarm.
Ce logiciel de peer-to-peer crypté... Cliquez pour télécharger OneSwarm PONAMEDIA PREMIUM - HELLLOOO FLASH DEMO (V8.4)PONAMEDIA PREMIUM - HELLLOOO FLASH DEMO (V8.4)PONAMEDIA TV DEVIENS HELLLOOO FLASH
LA TV SUR VOTRE ORDINATEUR.
Toute une plateforme Multi... Cliquez pour télécharger PONAMEDIA PREMIUM - HELLLOOO FLASH DEMO Academy System (17.2.1.0)ACADEMY SYSTEM (17.2.1.0)Logiciel de gestion des établissements.
- élèves/étudiants (inscription, dossier, absence...)
-... Cliquez pour télécharger Academy System Easy-Planning (1.0.0.1)EASY-PLANNING (1.0.0.1)Basé sur les mêmes principes que MyPlanning, Easy-Planning permet de créer des plannings sous la ... Cliquez pour télécharger Easy-Planning
|