Я пытаюсь создать приложение, которое, когда цвет пикселя на экране меняется на другой (что я знаю, что это такое), что-то делает, не имеет большого значения для вопроса, что он делает.
В любом случае, я использую это:
CGImageRef window283x420 = CGWindowListCreateImage(NSMakeRect(284, 420, 1, 1), kCGWindowListOptionOnScreenOnly, kCGNullWindowID, kCGWindowImageDefault);
NSBitmapImageRep *cannonOne = [[NSBitmapImageRep alloc] initWithCGImage:window283x420];
Тогда цвет, который я ожидаю, изменится здесь:
NSColor *color = [NSColor colorWithCalibratedRed:0.521569 green:0.380392 blue:0.231373 alpha:1];
И сравниваю цвета здесь:
while (![color isEqualToColor:[cannonOne colorAtX:0 y:0]]) {
CGImageRef window283x420 = CGWindowListCreateImage(NSMakeRect(284, 420, 1, 1), kCGWindowListOptionOnScreenOnly, kCGNullWindowID, kCGWindowImageDefault);
NSBitmapImageRep *cannonOne = [[NSBitmapImageRep alloc] initWithCGImage:window283x420];
if ([color isEqualToColor:[cannonOne colorAtX:0 y:0]]) {
Я знаю, что часть while / if могла бы быть лучше, но она должна работать просто отлично и не беспокоиться об оптимизации приложения до тех пор, пока оно на самом деле не будет работать.
Теперь, если, например, цвет пикселя на самом деле не меняется быстро (например, цвет остается таким же на некоторое время), он работает отлично. Если он похож на пиксель с цветом, который перемещается и достигает 283 * 420, но не остается там долго (например, 0,1 с) (как описано в примере выше), он не работает.
Время, в течение которого он остается, не должно быть проблемой, так как мое приложение очень быстро проверяет пиксель, как показано в отладке:
2010-01-04 22:12:58.230 appname[2372:a0f] Checked
2010-01-04 22:12:58.231 appname[2372:a0f] Checked
Есть идеи? :)