函數CGEventKeyboardSetUnicodeString使用UniCharCount和const UniChar unicodeString []。我無法弄清楚如何使用pyobjc從python調用它。理想情況下,我希望能夠傳遞一個python unicode字符串。有沒有辦法修改這個函數的元數據,所以我可以做到這一點?另外,有沒有辦法讓我把python unicode字符串轉換成一個UNICHAR數組和一個使用pyobjc的長度?如何從python調用CGEventKeyboardSetUnicodeString?
澄清:
我使用pyobjc版本2.5.1
CGEventKeyboardSetUnicodeString的元數據:
>>> pprint(CGEventKeyboardSetUnicodeString.__metadata__())
{'arguments': ({'already_cfretained': False,
'already_retained': False,
'null_accepted': True,
'type': '^{__CGEvent=}'},
{'already_cfretained': False,
'already_retained': False,
'type': 'L'},
{'already_cfretained': False,
'already_retained': False,
'null_accepted': True,
'type': '^T'}),
'retval': {'already_cfretained': False,
'already_retained': False,
'type': 'v'},
'variadic': False}
我已經試過如下:
>>> CGEventKeyboardSetUnicodeString(event, 1, 'a')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: depythonifying 'pointer', got 'str'
>>> CGEventKeyboardSetUnicodeString(event, 1, u'a')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: depythonifying 'pointer', got 'unicode'
>>> CGEventKeyboardSetUnicodeString(event, 1, [ord('a')])
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: depythonifying 'pointer', got 'list'
>>> Quartz.CGEventKeyboardSetUnicodeString(event, 1, struct.unpack('>{}H'.format(1), u'a'.encode('utf-16-le')))
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: depythonifying 'pointer', got 'tuple'
OK,它看起來像PyObjC 2.5.1(你必須手動安裝,因爲蘋果最新版本是2.3.2a0)有我在談論修復......顯然這不是正確的解決辦法。讓我看看它。 – abarnert
當我使用Python 3.3.0或2.7.5在2.4.0或頂級的PyObjC中測試這個時,我得到了與參數不同且正確的元數據。類型是'n^T',它有'c_array_length_in_arg = 1'。並將它傳遞給一個Python'unicode'對象工作正常。你正在使用'Quartz'而不是'CoreGraphics'的功能,對吧? – abarnert
再看看這個......它看起來像PyObjC 2.4.0修復了這些函數,2.5.0可能再次打破了它們(以不同的方式),而2.6.0可能再次修復它們......這很難確定,安裝我可以測試的所有版本,當我知道時我會報告回來。如果我是對的,最好的解決方案可能會或可能不會將2.6橋接支持文件複製到2.5.1 ...但是,一旦我做到了,我會讓你知道。 – abarnert