objective-c – 如何监视全局修饰符键状态(在任何应用程序中)?

objective-c – 如何监视全局修饰符键状态(在任何应用程序中)?,第1张

概述我在 Cocoa项目中使用一些Carbon代码来处理来自其他应用程序全局关键事件(快捷方式).目前我已经设置了一个kEventHotKeyReleased事件处理程序,当我的应用程序不活动时,我可以成功获取热键.这在我的应用程序中触发了一些 *** 作. 与kEventHotKeyReleased的行为有关的问题是: 例如,我按Cmd-Shift-P组合键.一旦释放“P”键,触发热键事件.当所有的键都被 我在 Cocoa项目中使用一些Carbon代码来处理来自其他应用程序的全局关键事件(快捷方式).目前我已经设置了一个kEventHotkeyreleased事件处理程序,当我的应用程序不活动时,我可以成功获取热键.这在我的应用程序中触发了一些 *** 作.

与kEventHotkeyreleased的行为有关的问题是:

例如,我按Cmd-Shift-P组合键.一旦释放“P”键,触发热键事件.当所有的键都被取消时,我需要触发事件(或者手动触发它)(也就是Cmd和Shift键被释放).

很容易监控热键,但是我没有看到任何监视单个按键.如果我可以监控修饰符键状态,我会在业务.

任何提示如何做到这一点?

提前致谢!

更新:

我已经尝试使用kEventRawKeyUp和kEventRawKeyModifIErsChanged,但是kEventHotkeyreleased工作这两个,即使我设置它们的方式与kEventHotkeyreleased完全相同.

Eventtypespec eventTypes[] = {{kEventClassKeyboard,kEventHotkeyreleased},{kEventClassKeyboard,kEventRawKeyUp}};// Changing the order in the List does not help,nor does removing kEventHotkeyreleasedOsstatus err = InstallApplicationEventHandler(&globalHotkeyHandler,GetEventTypeCount(eventTypes),eventTypes,NulL,NulL);// err == noErr after this line

为了kEventHotkeyreleased而调用globalHotKeyHandler方法,但是由于某些原因我似乎无法掌握,因此不适用于kEventRawKeyUp.以下是我的globalHotKeyHandler方法:

Osstatus globalHotkeyHandler(EventHandlercallref nextHandler,EventRef anEvent,voID *userData) {    NSLog(@"Something happened!");}

有没有额外的电话需要做或别的我忘了?

N.B:乍看起来,似乎可能是辅助设备的Access被禁用,但不是.所以我很无知

更新2:

我调查了一下CGEventTap Leibowitzn的建议,我想出了这个设置:

CFMachPortRef keyUpEventTap = CGEventTapCreate(kCGHIDEventTap,kCGheadInsertEventTap,kCGEventTapOptionListenOnly,kCGEventKeyUp,&keyUpCallback,NulL);CFRunLoopSourceRef keyUpRunLoopSourceRef = CFMachPortCreateRunLoopSource(NulL,keyUpEventTap,0);CFRelease(keyUpEventTap);CFRunLoopAddSource(CFRunLoopGetCurrent(),keyUpRunLoopSourceRef,kcfRunLoopDefaultMode);CFRelease(keyUpRunLoopSourceRef);

…和回调:

CGEventRef keyUpCallback (CGEventTapProxy proxy,CGEventType type,CGEventRef event,voID *refcon) {    NSLog(@"KeyUp event tapped!");    return event;}

正如你可以看到,我使用kCGEventKeyUp作为事件点击的掩码,但不知何故,我正在接收鼠标向下的事件!

更新3:

好的忘了,我忽略了文档中使用CGEventMaskBit(kCGEventKeyUp)这个参数的行,所以正确的调用是:

CGEventTapCreate(kCGHIDEventTap,CGEventMaskBit(kCGEventKeyUp),NulL);

我仍然有一个问题:修饰符键不触发kCGEventKeyUp …

更新4:

好的忘了再一次…我一定会回答自己的问题5分钟后问他们今天啊!

要截取修饰键,请使用kCGEventFlagsChanged:

CGEventTapCreate(kCGHIDEventTap,CGEventMaskBit(kCGEventFlagsChanged),&callbackFunction,NulL);

所以本质上我得到了关键和修正键状态检测工作,但我仍然有兴趣知道为什么kEventRawKeyUp不工作…

N.B:另请注意,我正在Tiger开发,目的是尽可能多地支持新旧版本的 *** 作系统. CGEventTap是10.4,所以现在我将使用它,但是可以接受向后兼容的解决方案.

解决方法 一个选项是使用EventTaps.这可以让您监控所有键盘事件.看到:
http://developer.apple.com/mac/library/documentation/Carbon/Reference/QuartzEventServicesRef/Reference/reference.html#//apple_ref/c/func/CGEventTapCreate

不幸的是,如果应用程序要求安全输入,事件点击将停止工作.例如Quicken.

总结

以上是内存溢出为你收集整理的objective-c – 如何监视全局修饰符键状态(在任何应用程序中)?全部内容,希望文章能够帮你解决objective-c – 如何监视全局修饰符键状态(在任何应用程序中)?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/1252080.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-07
下一篇 2022-06-07

发表评论

登录后才能评论

评论列表(0条)

保存