2013-08-23 48 views
6

NSEvent keyCode cung cấp mã quét bàn phím, là mã phần cứng cụ thể đại diện cho khóa vật lý. Tôi muốn chuyển đổi mã quét thành mã khóa ảo, đó là khóa logic dựa trên bố cục bàn phím người dùng (QWERTY, AZERTY, v.v.).Bản đồ Mã khóa NSEvent mã khóa ảo

Trong Windows, tôi có thể thực hiện việc này qua MapVirtualKey. Tương đương OS X là gì?

Trả lời

16

Mã khóa ảo chính xác là không phải dựa trên bố cục bàn phím của người dùng. Nó cho biết phím nào đã được nhấn, không phải ký tự mà khóa sẽ tạo ra cũng như cách nó được gắn nhãn.

Ví dụ, kVK_ANSI_A (từ Carbon/HIToolbox/Events.h, giá trị 0x00) không không nghĩa chìa khóa trong đó sản xuất các ký tự 'A', nó có nghĩa là chìa khóa mà là ở vị trí mà 'A' chính là trong một bàn phím tiêu chuẩn ANSI. Nếu bố cục bàn phím tiếng Pháp đang hoạt động, phím đó sẽ tạo 'Q'. Nếu bàn phím vật lý là bàn phím tiếng Pháp, khóa đó có thể sẽ được gắn nhãn 'Q'.

Vì vậy, mã khóa ảo giống như mã quét, nhưng từ bàn phím chuẩn, lý tưởng. Đó là, như đã nói, phần cứng độc lập. Nó cũng độc lập với bố trí bàn phím.

Để dịch từ mã khóa ảo sang ký tự, bạn có thể sử dụng UCKeyTranslate(). Bạn cần dữ liệu 'uchr' cho bố cục bàn phím hiện tại. Bạn có thể nhận được điều đó bằng cách sử dụng TISCopyCurrentKeyboardLayoutInputSource() và sau đó TISGetInputSourceProperty() với kTISPropertyUnicodeKeyLayoutData làm khóa thuộc tính.

Bạn cũng cần có mã loại bàn phím. Tôi tin rằng nó vẫn được hỗ trợ để sử dụng LMGetKbdType() để nhận được điều đó, mặc dù nó không còn được ghi lại ngoại trừ trong phần kế thừa. Nếu bạn không thích điều đó, bạn có thể có được một CGEvent từ NSEvent, tạo CGEventSource từ đó sử dụng CGEventCreateSourceFromEvent(), và sau đó sử dụng CGEventSourceGetKeyboardType() và gọi CGEventGetIntegerValueField() với kCGKeyboardEventKeyboardType để có được những loại bàn phím.

Tất nhiên, việc sử dụng -[NSEvent characters] hoặc -[NSEvent charactersIgnoringModifiers] dễ dàng hơn nhiều. Hoặc, nếu bạn đang triển khai chế độ xem văn bản, hãy gửi các sự kiện từ khóa đến -[NSResponder interpretKeyEvents:] (như được thảo luận trong Cocoa Event Handling Guide: Handling Key Events) hoặc -[NSTextInputContext handleEvent:] (như được thảo luận trong Cocoa Text Architecture Guide:Text Editing). Một trong số đó sẽ gọi lại chế độ xem với bộ chọn hành động thích hợp, như moveBackward: hoặc với -insertText: nếu phím tắt (trong ngữ cảnh của các sự kiện gần đây và nguồn đầu vào) sẽ tạo văn bản.

+0

Ah, cảm ơn vì đã giải thích các mã khóa ảo từ phối cảnh Mac, có vẻ như nó khác với Windows. Có vẻ như dễ nhất để kiểm tra ký tựIgnoringModifiers cho các ký tự mà ứng dụng của tôi quan tâm. – NateS

1

Theo tài liệu của NSEvent, -[NSEvent keyCode] trả về mã khóa ảo độc lập phần cứng.

+0

Hmm, bạn nói đúng, vì một lý do nào đó mà tôi đọc là phụ thuộc vào phần cứng, tôi đoán vì đó có vẻ là hành vi trong ứng dụng của tôi. Tôi đoán tôi có nhiều điều tra để làm. Không có gì để xem ở đây, tiếp tục ... – NateS

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