天天看點

ubuntu下qt模拟鍵盤按鍵按下_linux模拟鍵盤按鍵方案(收藏)

在這以前,我一直以為,除非搞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的源碼