2014-09-14 3 views
0

Вот мой текущий код, который не работает:Как смоделировать функцию скриншота (Mac) Cocoa?

CGEventSourceRef src = 
CGEventSourceCreate(kCGEventSourceStateHIDSystemState); 

CGEventRef cmdd = CGEventCreateKeyboardEvent(src, 0x37, true); 
CGEventRef cmdu = CGEventCreateKeyboardEvent(src, 0x37, false); 
CGEventRef optd = CGEventCreateKeyboardEvent(src, 0x3A, true); 
CGEventRef optu = CGEventCreateKeyboardEvent(src, 0x3A, false); 
CGEventRef dd = CGEventCreateKeyboardEvent(src, 0x02, true); 
CGEventRef du = CGEventCreateKeyboardEvent(src, 0x02, false); 

CGEventSetFlags(dd, kCGEventFlagMaskCommand^kCGEventFlagMaskAlternate); 
CGEventSetFlags(du, kCGEventFlagMaskCommand^kCGEventFlagMaskAlternate); 


CGEventTapLocation loc = kCGHIDEventTap; // kCGSessionEventTap also works 
CGEventPost(loc, cmdd); //Cmd down 
CGEventPost(loc, optd); //Option down 
CGEventPost(loc, dd); //D down 
CGEventPost(loc, cmdu); //Cmd up 
CGEventPost(loc, optu); //Option up 
CGEventPost(loc, du); //D up 

CFRelease(cmdd); 
CFRelease(cmdu); 
CFRelease(optd); 
CFRelease(optu); 
CFRelease(dd); 
CFRelease(du); 
CFRelease(src); 

Что мне нужно изменить, чтобы сделать его работу? Кто-нибудь знает, почему он не работает?

ответ

0

мне удалось решить мой вопрос

Вот как я это сделал:

  1. Я сделал файл сценария оболочки, который выполняется командой "ScreenCapture -s/темп/tempscr/PNG"
  2. затем я скопировал файл .sh в мой «Поддержка Files» папку в моем приложении
  3. затем я выполнил следующий код:

    NSString *path = @"/Applications/CloudSyncMac.app/Contents/Resources/screencapture.sh"; 
    NSArray *args = [NSArray arrayWithObjects:nil, nil]; 
    [[NSTask launchedTaskWithLaunchPath:path arguments:args] waitUntilExit]; 
    
  4. Это работает !!!

2

Я не могу понять, почему вы хотите сделать снимок экрана, эмулируя команды клавиш, чтобы сделать это (что может быть изменено так, чтобы он был хрупким). гораздо лучше во всех отношениях просто делать это программно. Apple имеет example code, и Quartz Display Services documentation может помочь вам в этом.

+0

Я пытался это сделать, и люди говорят, что это невозможно, ха-ха! Я изначально хотел сделать это программно. Благодаря! – CloudSync

+0

В примере показан только полный захват экрана, и я хотел бы использовать функцию пользовательского интерфейса для выбора региона. Возможно ли это? – CloudSync

+0

Вместо 'CGDisplayCreateImage()', используйте 'CGDisplayCreateImageForRect(). Вы можете использовать свой собственный пользовательский интерфейс, чтобы пользователь мог выбрать прямоугольник (прозрачное оверлейное окно, в котором вы рисуете полупрозрачный прямоугольник выбора). –

0

Посмотрите инструмент командной строки в «ScreenCapture» - страница людей здесь: man screencapture

Это доступно, по меньшей мере, 10,6 и избавит вас от необходимости кодировать логик самостоятельно.

Например, в режиме «screencapture -s ~/Desktop/screenshot.png» в терминале будет выполняться захват экрана на основе региона и размещать вывод на «screenshot.png» на вашем рабочем столе.

Вы можете вызвать инструмент командной строки, используя функцию C system() 'библиотеки C.

Смежные вопросы