这是事情,我用windows api EnumWindows编写了一个程序,它需要一个回调函数作为第一个arg,我的可怜代码如下:
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'?
答案 0 :(得分:2)
因为你使用的是Python 3,它将abcd
视为一个Unicode字符串,它使用UTF-16进行ctypes编码。但是,假设它是单字节ANSI字符串,那么你将它转换为它。
您可以通过以下方法之一使程序按您希望的方式运行:
EnumWindows
:EnumWindows(cb_proc, b'abcd')
c_wchar_p
:cast(lparam, c_wchar_p)