2011-08-11 116 views
1

這裏是東西,我寫了使用Windows API的EnumWindows的一個程序,它需要一個回調FUNC作爲第一個參數,我可憐的代碼如下:[python]:如何通過使用ctypes從指針獲取字符串?

User32 = WinDLL('User32.dll') 
LPARAM = wintypes.LPARAM 

HWND = wintypes.HWND 
BOOL = wintypes.BOOL 

def Proc(hwnd, lparam): 
    print("hwnd = {}, lparam = {}".format(hwnd, cast(lparam, c_char_p))) 
    return True 

WNDPROCFUNC = WINFUNCTYPE(BOOL, HWND, LPARAM) #用winfunctype 比cfunctype 好 
cb_proc = WNDPROCFUNC(Proc) 

EnumWindows = User32.EnumWindows 
EnumWindows.restype = BOOL 

EnumWindows(cb_proc, 'abcd') 

然後我跑的程序,但它只是打印

hwnd = 65820, lparam = c_char_p(b'a') 
hwnd = 65666, lparam = c_char_p(b'a') 
hwnd = 65588, lparam = c_char_p(b'a') 
hwnd = 65592, lparam = c_char_p(b'a') 
hwnd = 1311670, lparam = c_char_p(b'a') 
hwnd = 591324, lparam = c_char_p(b'a') 
hwnd = 66188, lparam = c_char_p(b'a') 
hwnd = 393862, lparam = c_char_p(b'a') 

爲什麼不b'abcd'?

回答

2

因爲您正在使用Python 3將abcd當作Unicode類型的字符串,並且ctypes使用UTF-16進行編碼。但是你假設它是一個單字節的ANSI字符串。

可以使程序的行爲要通過下列方法之一方法:

  1. 使用Python 2.x的
  2. 呼叫EnumWindows像這樣:EnumWindows(cb_proc, b'abcd')
  3. 使用c_wchar_p的情況下: cast(lparam, c_wchar_p)
+0

非常感謝你,它的工作原理。順便說一句,爲什麼ctypes使用utf-16編碼字符串而不是utf-8?使用utf-8不是很方便嗎? – Alcott

+1

@Alcott Windows API使用UTF16而不是UTF8。 –

相關問題