I have written a small productivity tool that does a few string manipulations via the clipboard.
It is currently registering a hot key, where it pulls in the clipboard text, processes it, and dumps the result back on the clipboard.
I have this installed on CMD+SHIFT+V
currently what you need to do from another apppiclation is copy (CMD+C) and then activate my hothandler (CMD+SHIFT+V), and then you have to paste it back into the orginal app with (CMD+V).
I'd like to eliminate the third step if possible, so my hothandler somehow tells whatever is the active application to paste.
Any suggestions how to do this?
My code (minus the actual boring text replacement stuff) is this:
Please note this needs carbon framework for hotkey handlers
[EDIT:] I borrowed code from this answer on stack overflow for the hotkey handler code.
AppDelegate.h
#import <Cocoa/Cocoa.h>
#import <Foundation/Foundation.h>
#import <Carbon/Carbon.h>
@interface AppDelegate : NSObject <NSApplicationDelegate> {
EventHotKeyRef hotKeyRef;
}
@property (assign) IBOutlet NSWindow *window;
-(IBAction) checkClipboard:(id) sender ;
@end
AppDelegate.m
#import "AppDelegate.h"
//#import "NSString+cppMacros.h" // not relevant to question
OSStatus _AppDelegateHotKeyHandler(EventHandlerCallRef nextHandler, EventRef event, void *userData) {
AppDelegate *appDel = [[NSApplication sharedApplication] delegate];
[appDel checkClipboard:nil];
return noErr;
}
@implementation AppDelegate
- (void)installHotkey {
if (!hotKeyRef) {
EventHotKeyID hotKeyId;
EventTypeSpec eventType;
eventType.eventClass = kEventClassKeyboard;
eventType.eventKind = kEventHotKeyPressed;
InstallApplicationEventHandler(&_AppDelegateHotKeyHandler, 1, &eventType, NULL, NULL);
hotKeyId.signature = 'hotk';
hotKeyId.id = 1337;
RegisterEventHotKey(kVK_ANSI_V, cmdKey + shiftKey, hotKeyId, GetApplicationEventTarget(), 0, &hotKeyRef);
NSLog(@"_AppDelegateHotKeyHandler installed");
}
}
-(void) uninstallHotkey {
if (hotKeyRef) {
UnregisterEventHotKey(hotKeyRef);
hotKeyRef = nil;
NSLog(@"_AppDelegateHotKeyHandler uninstalled");
}
}
-(IBAction) checkClipboard:(id) sender {
NSPasteboard *pasteboard = [NSPasteboard generalPasteboard];
NSArray *types = [NSArray arrayWithObjects:NSStringPboardType, nil];
NSString *text = [pasteboard stringForType:NSPasteboardTypeString];
NSLog(@"clipboard input:%@",text);
/* actual code is this: (not relevant to question)
NSString *newText = [text isMacroEncoded] ? [text macroDecodedString] : [text macroEncodedString];
*/
// demo code for question
NSString *newText = [@"Pasted:" stringByAppendingString:text];
[pasteboard declareTypes:types owner:self];
[pasteboard setString:newText forType:NSStringPboardType];
NSLog(@"clipboard output:%@",newText);
}
- (void)applicationDidFinishLaunching:(NSNotification *)aNotification
{
// Insert code here to initialize your application
hotKeyRef = nil;
[self installHotkey];
}
-(void) applicationWillTerminate:(NSNotification *)notification {
[self uninstallHotkey];
}
@end
It turns out there is a way to do what I want.
void pasteCurrent() {
CGEventRef commandDown = CGEventCreateKeyboardEvent(NULL, kVK_Command, YES);
CGEventRef VDown = CGEventCreateKeyboardEvent(NULL, kVK_ANSI_V, YES);
CGEventRef VUp = CGEventCreateKeyboardEvent(NULL, kVK_ANSI_V, NO);
CGEventRef commandUp = CGEventCreateKeyboardEvent(NULL, kVK_Command, NO);
CGEventSetFlags(VDown,kCGEventFlagMaskCommand);
CGEventSetFlags(VUp,kCGEventFlagMaskCommand);
CGEventPost(kCGHIDEventTap, commandDown);
CGEventPost(kCGHIDEventTap, VDown);
CGEventPost(kCGHIDEventTap, VUp);
CGEventPost(kCGHIDEventTap, commandUp);
CFRelease(commandDown);
CFRelease(VDown);
CFRelease(VUp);
CFRelease(commandUp);
}