I’ve discovered a slightly better approach which provides for ASobjC all of the functionality of “addGlobalMonitorForEventsMatchingMask:handler:”.
As above, you add an Objective-C class, GlobalMonitor:
GlobalMonitor.h
#import <Cocoa/Cocoa.h>
static id myNextMonitor;
@interface GlobalMonitor : NSObject
+(id) monitorEvery: (NSEventMask) eventMask performSelector: (SEL) aSelector target: (id) target;
+(void) monitorNext: (NSEventMask) eventMask performSelector: (SEL) aSelector target: (id) target;
+(void) removeMonitor: (id) monitor;
@end
GlobalMonitor.m
#import "GlobalMonitor.h"
@implementation GlobalMonitor
+(id) monitorEvery: (NSEventMask) eventMask performSelector: (SEL) aSelector target: (id) target {
id myHotKey = [NSEvent addGlobalMonitorForEventsMatchingMask:eventMask handler:^(NSEvent *event) {
NSLog(@"EveryMonitorEvent");
[target performSelector: aSelector withObject: event];
}];
return myHotKey;
}
+(void) monitorNext: (NSEventMask) eventMask performSelector: (SEL) aSelector target: (id) target {
myNextMonitor = [NSEvent addGlobalMonitorForEventsMatchingMask:eventMask handler:^(NSEvent *event) {
NSLog(@"NextMonitorEvent");
[NSEvent removeMonitor: myNextMonitor];
[target performSelector: aSelector withObject: event];
}];
}
+(void) removeMonitor: (id) monitor {
[NSEvent removeMonitor: monitor];
}
@end
This class has three class methods:
+(void) monitorNext: (NSEventMask) eventMask performSelector: (SEL) aSelector target: (id) target;
which listens for the next event matching the NSEventMask, performs the selector (a one argument handler) of the target (your script)
To use this in ASobjC,
GlobalMonitor's monitorNext_performSelector_target_(current application's NSLeftMouseDownMask, "eventHappens:", me)
listens for the next left mouse down and when it occurs, runs the hander: eventHappens_(theEvent).
The second method,
+(id) monitorEvery: (NSEventMask) eventMask performSelector: (SEL) aSelector target: (id) target;
works just like the last, but listens for every matching event and returns a reference to itself so that the third method,
+(void) removeMonitor: (id) monitor;
can turn it off.
For example in ASobjC,
set myMonitor to GlobalMonitor's monitorEvery_performSelector_target_(current application's NSLeftMouseDownMask, "eventHappens:", me)
turns on a monitor and
GlobalMonitor's removeMonitor_(myMonitor)
turns it off.
Finally the selector (handler) that you use has one parameter so that it can be passed a reference to the event. For example, this might be the selector:
on eventHappens_(theEvent)
if (theEvent's type) as integer is current application's NSLeftMouseDown then
say "left mouse down"
else if (theEvent's type) as integer is current application's NSLeftMouseUp then
say "left mouse up"
end if
end eventHappens_
EricN