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

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條評論
主站蜘蛛池模板: 狠狠色狠狠色综合婷婷tag | 91年精品国产福利线观看久久 | 一级一毛片a级毛片 | 午夜噜噜噜私人影院在线播放 | 精品伊人久久大香线蕉网站 | 国产成人永久在线播放 | 中文在线免费不卡视频 | 欧美日韩一区二区三区久久 | 国产精品第二页在线播放 | 欧洲美女高清一级毛片 | 久久精品久久久久久久久人 | 亚洲久久网 | 成人性生交大片免费看午夜a | 手机看片神马午夜片 | 黄色的视频免费看 | 亚洲一区二区免费视频 | 成人欧美视频免费看黄黄 | 天天射天天搞 | 国产福利不卡视频在免费播放 | 久久99亚洲精品久久 | 四虎国产精品成人永久免费影视 | 久久免费国产 | 久久福利小视频 | 日本一级作爱片在线观看 | 韩国欧美一级毛片免费 | 夜夜夜爽爽爽久久久 | 久久亚洲日本不卡一区二区 | h片免费网站 | 久久精品国产一区二区三区不卡 | 精品国产人成亚洲区 | 国产精品福利一区二区久久 | 国产精品一区二区欧美视频 | 99久久精品费精品国产一区二区 | 亚洲欧美日韩激情在线观看 | 日韩久久免费视频 | 天天干天天插天天 | 国产精品综合视频 | 国产成综合 | 中文日韩字幕 | 欧美一级日韩 | 久久都是精品 |