#include <stdio.h>
#include <windows.h>
#include <math.h>
// RGB转HSV的函数
void rgb2hsv(int r, int g, int b, float *h, float *s, float *v) {
float rf = r / 255.0f;
float gf = g / 255.0f;
float bf = b / 255.0f;
float max_val = fmaxf(rf, fmaxf(gf, bf));
float min_val = fminf(rf, fminf(gf, bf));
float delta = max_val - min_val;
// 计算V
*v = max_val;
// 计算S
if (max_val == 0) {
*s = 0;
}
else {
*s = delta / max_val;
}
// 计算H
if (delta == 0) {
*h = 0; // 无色
}
else {
if (max_val == rf) {
*h = fmodf(((gf - bf) / delta), 6);
}
else if (max_val == gf) {
*h = ((bf - rf) / delta) + 2;
}
else { // max_val == bf
*h = ((rf - gf) / delta) + 4;
}
*h *= 60; // 转换为度数
if (*h < 0) {
*h += 360;
}
}
}
int main() {
POINT mousePos;
HDC hdcScreen;
COLORREF pixelColor;
int r, g, b;
float h, s, v;
char key;
printf("实时鼠标位置及颜色监视器\n");
printf("按ESC键退出程序\n\n");
hdcScreen = GetDC(NULL); // 获取整个屏幕的设备上下文
while (1) {
// 检查是否按下ESC键
if (GetAsyncKeyState(VK_ESCAPE) & 0x8000) {
break;
}
// 获取鼠标位置
GetCursorPos(&mousePos);
// 获取指定位置的像素颜色
pixelColor = GetPixel(hdcScreen, mousePos.x, mousePos.y);
// 提取RGB分量
r = GetRValue(pixelColor);
g = GetGValue(pixelColor);
b = GetBValue(pixelColor);
// 转换为HSV
rgb2hsv(r, g, b, &h, &s, &v);
// 清除当前行并显示信息
printf("\r位置: (%4d, %4d) RGB: (%3d, %3d, %3d) HSV: (%.1f°, %.1f%%, %.1f%%) ",
mousePos.x, mousePos.y,
r, g, b,
h, s * 100, v * 100);
// 刷新输出缓冲区
fflush(stdout);
// 短暂延迟,减少CPU占用
Sleep(50);
}
ReleaseDC(NULL, hdcScreen); // 释放设备上下文
printf("\n程序已退出\n");
return 0;
}