如何模拟屏幕截图功能(Mac)Cocoa?

时间:2014-09-14 16:48:33

标签: objective-c xcode macos cocoa simulation

这是我当前的代码无效:

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);

我需要更改什么才能使其正常工作?有谁知道为什么它不起作用?

3 个答案:

答案 0 :(得分:2)

我无法理解为什么你想通过模拟关键命令来做截图(可以通过改变btw使其脆弱)。以编程方式简单地执行此操作会更好。 Apple对此有example codeQuartz Display Services documentation除此之外可以帮助您。

答案 1 :(得分:0)

看一下'screencapture'命令行工具 - 手册页在这里: man screencapture

至少可以从10.6开始使用,这将使您不必自己编写逻辑代码。

例如,在终端中执行'screencapture -s~ / Desktop / screenshot.png'将运行基于区域的屏幕捕获,并将输出放在桌面上的'screenshot.png'中。

您可以使用C库的system()函数调用命令行工具。

答案 2 :(得分:0)

我设法解决了我的问题

我是这样做的:

  1. 我制作了一个执行命令的shell脚本文件" screencapture -s / temp / tempscr / png"
  2. 然后我将.sh文件复制到我的"支持文件"我的应用程序中的文件夹
  3. 然后我执行了以下代码:

    NSString *path = @"/Applications/CloudSyncMac.app/Contents/Resources/screencapture.sh";
    NSArray *args = [NSArray arrayWithObjects:nil, nil];
    [[NSTask launchedTaskWithLaunchPath:path arguments:args] waitUntilExit];
    
  4. 有效!!!