ㄍ你老ㄇ??誤會大了。
AlienBBS 有一個讓我很不習慣的 bug,就是在處理 ctrl-key 的部份,只有在鍵盤語系為英文時才能正確輸入 ctrl-key ,中文輸入法下沒有辦法輸入 ctrl-Key。這和我目前的輸入習慣完全不符合,通常我是全都用中文語系,要輸入英文也只是按 Caps-Lock。如果在 AlienBBS 切成英文語系,和其他程式剛好處於不同的狀態,累積好幾年下來的習慣就會常常讓我按錯。 為什麼會有這種問題呢?因為 Cocoa 在處理鍵盤事件的時候,用 characters 或 charactersIgnoringModifiers 所得到的字元是經 Carbon TSM (Text Service Manager) 轉換成目前的鍵盤對映,例如以下這段程式碼:
- (void) keyDown:(NSEvent *) theEvent { if ([theEvent modifierFlags] & NSControlkeyMask) NSLog(@"Ctrl-%@n", [theEvent charactersIgnoringModifiers]); }
執行看看吧: Ctrl-e // Fine, let's swith to chinese input method... Ctrl-ㄍ //WTF is this? BoPoMoFo!
據我猜測,應該是作者使用了 charactersIgnoringModifiers 的緣故。了解了原因以後,要如何達成在不同輸入法下,都可以在按下 ctrl+[a-z] 時能處理正確呢?其實可以直接這樣寫:
if([theEvent modifierFlags] & NSControlKeyMask) { NSLog(@"Ctrl-%cn", 'a' + [[theEvent characters] characterAtIndex: 0]); }
按 ctrl-a 時,收到的字元是 0 ; ctrl-b 是 1 ,以此類推。
另外提供一個 95% 滿意的解決方法,那就是 [NSEvent keycode]。這個 method 會傳回一個 unsigned short ,是和鍵盤對應表無關,只和硬體的鍵位有關的。因此不論是 e 還是 ㄍ ,只要在鍵盤上是同一個按鍵,他們傳回來的 keycode 都是相同的。而 keycode 的對應表如下:
這個方法有什麼問題呢?那就是世界上不只是 qwerty 鍵盤而已啊!還有 dvorak 等甚至我不知道的鍵盤排列,而且在資訊系這個怪人叢集的地方還不少人用哩。你靠著上面的對應表用 qwerty 硬幹,用 dvorak 鍵盤的人就會發生 “按 ctrl-t 結果送出 ctrl-k” 的慘事。若用這個方法可能就要做個選項讓使用者選鍵盤佈局並且可以自定鍵盤對應。
“Finally I move to OV.”
---yllan. 9/4, 2005