- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在使用 CGEventTapCreateForPSN 来捕获和过滤我的应用程序的 key 。我对拦截其他应用程序的事件不感兴趣。我很确定事件点击对于我的目的来说太过严厉,但我一直无法找到更好的方法,并且使用事件点击是有效的。
具体来说,这段代码实现了我想要的功能。
GetCurrentProcess(&psn);
CFMachPortRef eventTap = CGEventTapCreateForPSN(
&psn,
kCGHeadInsertEventTap,
kCGEventTapOptionDefault,
CGEventMaskBit(kCGEventKeyDown)
| CGEventMaskBit(kCGEventKeyUp),
eventCallback,
userInfo);
我的回调处理得很好,事件仅从当前应用程序拦截。
不幸的是,从 10.9 开始,所有获取当前 ProcessSerialNumber
的方法均已弃用。有一种旧的标准方法可以通过此初始化将 ProcessSerialNumber
传递给同一进程中的其他例程...
ProcessSerialNumber psn = { 0, kCurrentProcess };
但是在调用CGEventTapCreateForPSN
时这不起作用。头文件文档表明了这一点,以下代码片段返回 NULL
作为确认。
ProcessSerialNumber psn = { 0, kCurrentProcess };
CFMachPortRef eventTap = CGEventTapCreateForPSN(
&psn,
kCGHeadInsertEventTap,
kCGEventTapOptionDefault,
CGEventMaskBit(kCGEventKeyDown)
| CGEventMaskBit(kCGEventKeyUp),
eventCallback,
userInfo);
我可以使用CGEventTapCreate
,但它会点击整个主机,然后我需要过滤任何未定向到我的应用程序的内容,并且CGEventTapProxy
是不透明的,我不知道如何使用它来确定是否是我的应用程序。
我已验证已弃用的代码仍然有效,但 Apple 可以随时决定删除它。那么,有人知道我应该如何在 Mavericks 及其他地方调用 CGEventTapCreateForPSN
吗?
谢谢!
<小时/>更新
在10.11(我认为是El Capitan)中,添加了一个新功能。虽然它的文档为零,但它的签名与 CGEventTapCreateForPSN
几乎完全相同。
CFMachPortRef CGEventTapCreateForPSN(
void *processSerialNumber,
CGEventTapPlacement place,
CGEventTapOptions options,
CGEventMask eventsOfInterest,
CGEventTapCallBack callback,
void *userInfo);
CFMachPortRef CGEventTapCreateForPid(
pid_t pid,
CGEventTapPlacement place,
CGEventTapOptions options,
CGEventMask eventsOfInterest,
CGEventTapCallBack callback,
void *userInfo);
因此,不再需要已弃用的函数,因为 PID 可以用作第一个参数。
最佳答案
我认为您应该为此目的子类化 NSApplication 并重写 - (void)sendEvent:(NSEvent *)theEvent
方法。来自 docs :
You rarely should find a real need to create a custom NSApplication subclass. Unlike some object-oriented libraries, Cocoa does not require you to subclass NSApplication to customize app behavior. Instead it gives you many other ways to customize an app.
另外:
IMPORTANT
Many AppKit classes rely on the NSApplication class and may not work properly until this class is fully initialized. As a result, you should not, for example, attempt to invoke methods of other AppKit classes from an initialization method of an NSApplication subclass.
因此,您可以拦截通过应用程序传递的所有事件并调用自定义 NSApplicationDelegate 继承的协议(protocol)方法。
// in SubApplication.h
@protocol ExtendedApplicationDelegate : NSApplicationDelegate
- (void)applicationDidTrapSomeInterestingEvent:(NSEvent *)event;
@end
// in SubApplication.m
- (void)sendEvent:(NSEvent *)event
{
if ([event type] == NSKeyDown && [event keyCode]==_someCode)
{
// call application delegate method
}
[super sendEvent:event];
}
我不确定这种方法是否能解决问题,但你还是尝试一下。
关于macos - Mavericks+ 中的 CGEventTapCreateForPSN(已弃用 GetCurrentProcess),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29403795/
我正在使用 CGEventTapCreateForPSN 来捕获和过滤我的应用程序的 key 。我对拦截其他应用程序的事件不感兴趣。我很确定事件点击对于我的目的来说太过严厉,但我一直无法找到更好的方法
我是一名优秀的程序员,十分优秀!