Tak šlo by to třeba nějak takhle (měl jsem připravenou kostru programu protože nedavno jsem dělal něco podobnýho tak jsem to zkusil):
Kód:
#include <cstdlib>
#define WIN32_LEAN_AND_MEAN
#include <windows.h>
#include <tchar.h>
#include <ShellApi.h>
// Settings.
const COLORREF testColor = RGB(238, 205, 125);
const int posX = 200;
const int posY = 350;
int SystemError(LPTSTR sFuncName)
{
const int code = GetLastError();
LPTSTR buff;
FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_ALLOCATE_BUFFER,
NULL, code, 0,
(LPTSTR)&buff, 0, NULL);
MessageBox(NULL, buff, sFuncName, MB_OK | MB_ICONERROR);
LocalFree(buff);
return code;
}
HDC hDesktopDc = NULL;
void OnExit()
{
if (hDesktopDc) {
ReleaseDC(HWND_DESKTOP, hDesktopDc);
}
}
const LPTSTR appName = _T("PixelCheck");
int APIENTRY WinMain(
HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
// Check command line parameters.
if (!lpCmdLine || !*lpCmdLine) {
LPTSTR buff;
FormatMessage(FORMAT_MESSAGE_FROM_STRING | FORMAT_MESSAGE_ARGUMENT_ARRAY | FORMAT_MESSAGE_ALLOCATE_BUFFER,
_T("Usage: %1 <file_name_to_run>"), 0, 0,
(LPTSTR)&buff, 0, (va_list *)&appName);
MessageBox(NULL, buff, appName, MB_ICONERROR | MB_OK);
LocalFree(buff);
return EXIT_FAILURE;
}
hDesktopDc = GetWindowDC(HWND_DESKTOP);
if (!hDesktopDc) {
return SystemError(_T("GetWindowDC"));
}
// Release the DC on exit.
atexit(OnExit);
bool status = false;
for (;;) {
const COLORREF color = GetPixel(hDesktopDc, posX, posY);
if (CLR_INVALID == color) {
return SystemError(_T("GetPixel"));
} else {
if (color == testColor) {
if (!status) {
status = true;
// Run the file.
const int execResult = (int)ShellExecuteA(NULL, NULL, lpCmdLine, "", NULL, SW_SHOWNORMAL);
if (execResult <= 32) {
SystemError(_T("ShellExecute"));
}
}
} else {
status = false;
}
}
Sleep(200);
}
return EXIT_SUCCESS;
}
To si můžeš případně poštelovat a přeložit - parametr programu je cesta exe nebo něčeho, co se má spustit (spustí se cokoliv, co otevře explorer, případně i složka). Zavře se to tak, že to zabiješ ve správci úkolů (šlo by samozřejmě udělat okno, kterým bys to zavřel, ovšem okno má svojí message loop, takže by smyčka pro testování barvy okna musela běžet v jiným vlákně; nebo by šlo pomocí instalace globálního hooku navázat zpracování na změnu screenu, takže by se to spustilo vždycky při změně něčeho na obrazovce, ale to už je zase taky složitostí trochu jinde, je potřeba udělat DLL s hook procedurou atd.).
A fakt se ta barva objevuje celým screen a ne v nějakým okně jo? To je mi trochu divný (jo a btw. asi to nebude fungovat pro fullscreen video, nebo v directX hře apod. - pouze přímo pod Windows).
(co se týká toho tvýho IF, tak jak vidíš v kódu to zase neni tak jednoduchý, protože asi nechceš, aby se ti to spouštělo pořád dokola, když barva trvá, takže je potřeba si pamatovat stav, a jenom když se barva změní zpátky na jinou, stav shodit a při příští změně na požadovanou barvu opět spustit požadovanou aplikaci ...)