在這以前,我一直以為,除非搞XWindow級别的開發,否則根本沒法在Linux下模拟鍵盤消息,或者說鍵盤事件。像QT,GTK這些High Level的GUI library貌似根本沒有提供這些功能。這麼看起來,想要實作與Windows下SendMessage(hwnd, KEY_PRESS,0 ,128 )這樣類似的功能還真不容易。這大概是Linux下接口不統一的弊端吧。不過還好,我們有XTest(the X test extension)這個Xlib的擴充庫,用它可以實作我們想要的模拟鍵盤按鍵的功能。
比如說…
XTestFakeMotionEvent(…) // 模拟滑鼠移動事件
XTestFakeButtonEvent(…) // 模拟滑鼠按鍵事件
XTestFakeKeyEvent(…) // 模拟鍵盤按鍵事件
當然别忘了它的頭檔案“X11/extensions/XTest.h”
這裡還有Xtest的詳細接口定義:http://docsrv.sco.com:507/en/man/html.Xext/XTEST.Xext.html
用法還是比較簡單的,例子我先不給出,因為我發現了更加便捷的方法:那就是python的第三方擴充庫virtkey
virtkey(https://launchpad.net/virtkey): python extension for emulating keypresses and getting current keyboard layout
看看,多麼完美的解決方案,Ubuntu下有個叫OnBoard的虛拟鍵盤程式,就是用這個包包實作的。
我發現python-virtkey依賴于libxtst6這個包,那麼肯定也是用Xtest實作的咯~一翻源碼,果然如此。
(源碼:http://bazaar.launchpad.net/~onboard/virtkey/main/files)
使用方法真的很簡單哦,主要有兩系列接口:
press_keysym/release_keysym
和
press_unicode/release_unicode
前者接受keysym作為參數,後者接受鍵位的unicode.
舉個例子:
importvirtkeyimporttimedefsimulate(): v = virtkey.virtkey()time.sleep(3)v.press_unicode(ord("a"))v.release_unicode(ord("a"))v.press_keysym(65363)v.release_keysym(65363) simulate()
使用python運作,不出意外的話,在你的目前光标處會出現一個新字母“a”,而且光标會右移一位。
如果不用virtkey怎麼辦嗯?好說,請看virtkey的源碼