2012-02-16 37 views
6

Trong Mac OS/Cocoa, tôi có thể tổng hợp các mục nhập bàn phím - chuỗi - cho ứng dụng phía trước theo cách minh bạch không?Tạo sự kiện bàn phím cho ứng dụng phía trước

Để chính xác hơn, tôi không muốn gửi các ký tự đặc biệt hoặc chuỗi điều khiển. Nhu cầu duy nhất của tôi là để gửi các ký tự chuẩn.

Chỉ cần học here, mà AppleScript có thể làm các việc lừa như thế này:

tell application "TextEdit" 
    activate 

    tell application "System Events" 
     keystroke "f" using {command down} 
    end tell 
end tell 

Q: Làm thế nào tôi có thể làm điều này bằng ObjC/ca cao?

CẬP NHẬT 2012/02/18 - Nicks đề nghị tăng cường

Dựa trên mã Nick 's bên dưới, đây là giải pháp cuối cùng:

// First, get the PSN of the currently front app 
ProcessSerialNumber psn; 
GetFrontProcess(&psn); 

// make some key events 
CGEventRef keyup, keydown; 
keydown = CGEventCreateKeyboardEvent (NULL, (CGKeyCode)6, true); 
keyup = CGEventCreateKeyboardEvent (NULL, (CGKeyCode)6, false); 

// forward them to the frontmost app 
CGEventPostToPSN (&psn, keydown); 
CGEventPostToPSN (&psn, keyup); 

// and finally behave friendly 
CFRelease(keydown); 
CFRelease(keyup); 

Sử dụng phương pháp này, một nhấp chuột vào một nút của bảng điều khiển không kích hoạt nhắm mục tiêu sự kiện đến ứng dụng thực tế phía trước. Hoàn toàn những gì tôi muốn làm.

Trả lời

10

Chắc chắn, bạn sẽ muốn sử dụng CGEventCreateKeyboardEvent để tạo ra các sự kiện bàn phím, sau đó gửi cho họ như vậy:

CGEventRef keyup, keydown; 
    keydown = CGEventCreateKeyboardEvent (NULL, (CGKeyCode)56, true); 
    keyup = CGEventCreateKeyboardEvent (NULL, (CGKeyCode)56, false); 

    CGEventPost(kCGHIDEventTap, keydown); 
    CGEventPost(kCGHIDEventTap, keyup); 
    CFRelease(keydown); 
    CFRelease(keyup); 

Đó là phức tạp hơn một chút so với AppleScript nhưng nó lừa. Bạn do phải đăng nhập một cách rõ ràng và sau đó là một sự kiện keyup. Thông tin thêm tại Quartz Event Services Reference.

+0

Cảm ơn bạn! Không bao giờ làm bất cứ điều gì ở mức thấp như vậy. – SteAp

Các vấn đề liên quan