亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

MacOS中的全局快捷鍵設定 With Objective C

系統 1632 0

write by 九天雁翎(JTianLing) -- blog.csdn.net/vagrxie

討論新聞組及文件

全局快捷鍵屬于比較有用的功能了,在Windows下使用RegisterHotkey可以很方便的設定,(指的是通過程序設定啊)Qt中沒有封裝此功能,所以稍微麻煩一點,可以參看我原來的文章《 Qt/PyQt中使用系統全局的快捷鍵 》,換到了MacOS中后,又得重新學習了,真是悲哀。。。。。。。
搜遍互聯網,才總算發現有用的文章,《 Program Global Hotkeys in Cocoa Easily 》一文真是精華中的精華。不僅說明了怎么在MacOS中設定全局快捷鍵,而且超額的指點了怎么讓用戶在程序中自定義。。。。強就一個字,作者絕對是介于牛A及牛C之間的人物。
唯一還有點遺憾的是,作者雖然是說用Cocoa,但是其實使用了carbon框架,而carbon框架使用的還是C語言的接口,并且有回調函數的設置,導致接口使用上不能用純Objective C。。。。。。
本文僅記錄大致使用流程,作為備檔,詳細的接口意義及各類,結構的意義未作詳細說明(文檔中我都沒有查到較為詳細的說明)。

準備工作

如上所述,用了Carbon框架,所以首先得為工程添加框架得鏈接依賴,然后使用上包含Carbon/Carbon.h文件。

注冊全局快捷鍵回調函數

回調函數的原型如下:
OSStatus MyHotKeyHandler(EventHandlerCallRef nextHandler,EventRef theEvent,
void*userData) {
}

注冊的方式

EventTypeSpec eventType;
eventType.eventClass=kEventClassKeyboard;
eventType.eventKind=kEventHotKeyPressed;
InstallApplicationEventHandler(MyHotKeyHandler, 1, &eventType,NULL, NULL);
主要的函數是InstallApplicationEventHandler,表示注冊相應的回調函數,作為C語言接口,回調的函數原型必須一致。

注冊快捷鍵


EventHotKeyRef gMyHotKeyRef;
EventHotKeyID gMyHotKeyID;
gMyHotKeyID.signature='rt2h';
gMyHotKeyID.id=1;

RegisterEventHotKey(6, controlKey, gMyHotKeyID,
GetApplicationEventTarget(), 0, &gMyHotKeyRef);

gMyHotKeyID.signature='te2h';
gMyHotKeyID.id=2;

RegisterEventHotKey(7, controlKey, gMyHotKeyID,
GetApplicationEventTarget(), 0, &gMyHotKeyRef);
注冊快捷鍵,RegisterEventHotKey是整個過程中最重要的接口,第一個參數的數字,代表了最終響應的鍵值,這里有點奇怪,不是像Windows中那樣使用表示虛擬鍵值的宏,而是直接用按鍵代表的數字來表示,而且此數字甚為奇怪,我也很為納悶。比如上面的6,7分別表示Z鍵和X鍵。這些數字我只有在《 Program Global Hotkeys in Cocoa Easily 》一文中提到的 AsyncKeys 軟件中我才能正確的知道。此軟件運行時,如下圖:

上面就是我按Z鍵時,顯示的樣子,其中我們需要設置的值為AsyncKey Number那一欄的值,即6.。。。。。。。。原因不明,沒有深入了解。
RegisterEventHotKey第二參數是控制鍵的設置參數,分別可以為cmdKey, shiftKey, optionKey,controlKey,各自的意思我想就不用我講了,不過需要注意的是,同時設置時不是用一般的|符號來組合,而是用+。。。。。。這點還真是比較奇怪,難道Mac下的接口都是這樣設置的嗎?-_-!對了,不需要設置這樣的常量感到奇怪,Mac下的代碼風格有所不同,以前Windows下(其實我在其他平臺也是這樣),常量習慣性的全大寫,這樣大家就能知道這是不能改變的宏或者常量,但是Mac下的接口不是這樣。。。。但是,知道它們都是系統常量就好了。

實現回調函數


OSStatus MyHotKeyHandler(EventHandlerCallRef nextHandler,EventRef theEvent,
void*userData) {
EventHotKeyID hkCom;
GetEventParameter(theEvent,kEventParamDirectObject,typeEventHotKeyID,NULL,
sizeof(hkCom),NULL,&hkCom);
intl = hkCom.id;

switch(l) {
case1: //do something
convertRtfToHtml();
break;
case2: //do something
convertTextToHtml();
break;
}
returnnoErr;
}

這里通過GetEventParameter來獲取需要的信息,然后通過事件的ID來分辨是哪個快捷鍵按下。整個過程基本就是這樣了。

小結

接觸Cocoa的時間較短,發現接口設置的一些慣例都不太一樣,雖然在GUI世界,消息(或者說事件)驅動是肯定的,但是在Windows的Win32 API及MFC那個層面編寫代碼的時候(.net不了解,就不知道了),消息的流向是知道的,可控制的,消息響應的時候也常常在OnMessage函數中自己去設置,但是Cocoa中感覺封裝的層次更加高一些,我不知道消息從那兒來,又到哪兒去,只能通過回調或者控件的binding,action的鏈接,類的委托來設置我希望被調用的函數,具體啥時候調用,入口在哪,我都無法控制,這點,可能屬于從較為底層跑到較為高層有點不適應。作為C/C++程序員,可能難免帶上了一定的刨根問底的性格,甚至一定要回溯到系統加載進程的匯編代碼才肯善罷甘休,不然總是覺得沒有底,在不能徹底了解一個庫的源代碼前,甚至都不敢大量的使用,不然效率怎么樣,內存怎么控制的,健壯不健壯總是沒底,到了Objective C with Cocoa的世界后,還有點不適應。。。。。。。。。。

原創文章作者保留版權 轉載請注明原作者 并給出鏈接

write by 九天雁翎(JTianLing) -- blog.csdn.net/vagrxie



MacOS中的全局快捷鍵設定 With Objective C


更多文章、技術交流、商務合作、聯系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦?。。?/p>

發表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 青草福利 | 久热综合 | 四虎hu| 不卡一级aaa全黄毛片 | 免费涩涩视频 | 欧美乱码 | 亚洲a区视频 | 精品国产乱码一区二区三区麻豆 | 色伊伊| 99久久精品男女性高爱 | 国产视频久 | 不卡免费在线视频 | 午夜免费体验区 | 久久大香伊蕉在人线观看热2 | 91在线网址 | 亚洲一区欧美日韩 | 欧美性爰视频 | 青久草视频| 一级片短视频 | 国产综合亚洲欧美日韩一区二区 | 夜夜做日日做夜夜爽 | 亚洲视频999 | 国内精品不卡一区二区三区 | 五月四房 | 欧美亚洲国产精品久久 | 99热这里只有精品一区二 | 久久综久久美利坚合众国 | 日韩精品一区二区三区在线观看l | 欧美一级成人影院免费的 | 欧美日本综合一区二区三区 | 日韩视频 中文字幕 视频一区 | 亚洲成aⅴ人片在线观 | 国产亚洲欧美在线观看的 | 欧美看片 | 日韩视频一区 | 国产精品久久久久久久免费大片 | 国产婷婷色综合成人精品 | 国产伦精品一区二区三区视频小说 | 亚洲国产日韩欧美一区二区三区 | 奇米影视四色中文字幕 | 欧美久久一区二区 |