Objective c 从PID填充ProcessSerialNumber的另一种方法,因为GetProcessForPID已被弃用
我有一个模拟鼠标点击的窗口的CGWindowID和PID(int)。我可以使用以下代码段成功模拟mousedown和mouseup事件:Objective c 从PID填充ProcessSerialNumber的另一种方法,因为GetProcessForPID已被弃用,objective-c,c,macos,Objective C,C,Macos,我有一个模拟鼠标点击的窗口的CGWindowID和PID(int)。我可以使用以下代码段成功模拟mousedown和mouseup事件: NSEvent *customEvent = [NSEvent mouseEventWithType: NSEventTypeLeftMouseUp location: point mod
NSEvent *customEvent = [NSEvent mouseEventWithType: NSEventTypeLeftMouseUp
location: point
modifierFlags: 0 | NSEventModifierFlagCommand
timestamp:[NSDate timeIntervalSinceReferenceDate]
windowNumber:[self.windowID intValue]
context: nil
eventNumber: 0
clickCount: 1
pressure: 0];
ProcessSerialNumber psn = { 0, kNoProcess };
OSStatus err = GetProcessForPID(PID, &psn);
if (err == noErr) {
CGEvent = [customEvent CGEvent];
CGEventPostToPSN(&psn, CGEvent);
CGEvent = [customEvent CGEvent];
CGEventPostToPSN(&psn, CGEvent);
}
我担心的是GetProcessForPID已被弃用,因此我正在寻找替代方法来填充ProcessSerialNumber结构,以便使用CGEventPostToPSN。ProcessSerialNumber是包含高值和低值的结构:
struct ProcessSerialNumber {
UInt32 highLongOfPSN;
UInt32 lowLongOfPSN;
};
如果没有一种方法可以使用PID来获取它,那么我如何为已经运行的另一个进程找到它?我已尝试侦听NSWorkspaceDidActivateApplicationNotification并单击目标窗口,但该通知不包含序列号高值和低值
NSWorkSpace launchedApplications在结果数组中也包含此信息,但自10.7以来也不推荐使用。从NSWorkspace运行的应用程序不包含此信息,或者我遗漏了一些明显的信息吗?AIUI基本思想是PSN本身以及与之相关的所有API都已弃用。有什么原因不能直接使用
CGEventPostToPid
?我也偶然发现了这个,该死的。真不敢相信这段时间我没有看到PID方法和PSN方法。CGEventPostToPSN也应该被标记为不推荐的,所以开发人员被指向Pid方法。。。不过,谢谢你标记这个!苹果在他们的文档页面上有一个方便的报告问题的小表格,也许值得留下一个简短的说明。