【发布时间】:2014-02-24 16:06:01
【问题描述】:
我正在研究 C,因为我需要将 ctypes 库导入 python 以允许键盘控制。我正在尝试了解以下代码的工作原理:
import ctypes
import time
SendInput = ctypes.windll.user32.SendInput
# C struct redefinitions
PUL = ctypes.POINTER(ctypes.c_ulong)
class KeyBdInput(ctypes.Structure):
_fields_ = [("wVk", ctypes.c_ushort),
("wScan", ctypes.c_ushort),
("dwFlags", ctypes.c_ulong),
("time", ctypes.c_ulong),
("dwExtraInfo", PUL)]
class HardwareInput(ctypes.Structure):
_fields_ = [("uMsg", ctypes.c_ulong),
("wParamL", ctypes.c_short),
("wParamH", ctypes.c_ushort)]
class MouseInput(ctypes.Structure):
_fields_ = [("dx", ctypes.c_long),
("dy", ctypes.c_long),
("mouseData", ctypes.c_ulong),
("dwFlags", ctypes.c_ulong),
("time",ctypes.c_ulong),
("dwExtraInfo", PUL)]
class Input_I(ctypes.Union):
_fields_ = [("ki", KeyBdInput),
("mi", MouseInput),
("hi", HardwareInput)]
class Input(ctypes.Structure):
_fields_ = [("type", ctypes.c_ulong),
("ii", Input_I)]
# Actuals Functions
def PressKey(hexKeyCode):
extra = ctypes.c_ulong(0)
ii_ = Input_I()
ii_.ki = KeyBdInput( hexKeyCode, 0x48, 0, 0, ctypes.pointer(extra) )
x = Input( ctypes.c_ulong(1), ii_ )
SendInput(1, ctypes.pointer(x), ctypes.sizeof(x))
def ReleaseKey(hexKeyCode):
extra = ctypes.c_ulong(0)
ii_ = Input_I()
ii_.ki = KeyBdInput( hexKeyCode, 0x48, 0x0002, 0, ctypes.pointer(extra) )
x = Input( ctypes.c_ulong(1), ii_ )
SendInput(1, ctypes.pointer(x), ctypes.sizeof(x))
def AltTab():
'''
Press Alt+Tab and hold Alt key for 2 seconds in order to see the overlay
'''
PressKey(0x012) #Alt
PressKey(0x09) #Tab
ReleaseKey(0x09) #~Tab
time.sleep(2)
ReleaseKey(0x012) #~Alt
if __name__ =="__main__":
AltTab()
我不理解的部分与有符号和无符号整数有关:
int 的范围是 -32768 - 32767
unsigned int 的范围是 0 - 65535
我读到:“一个 2 字节数字可以显示的数字的总范围是 2^16,因为你有 16 位可以表示一个数字。2^16 与 65536 相同,因为我们计算从 0 开始,与 0 - 65535 相同。这显然与 unsigned int 的值相匹配,因此您可以看到这就是该类型的操作方式。”
这似乎有道理,但有一点我不明白:
1 字节 = 8 位 2 字节 = 16 位
那么为什么将 2 字节数称为 2^16 而不是 2^8?
【问题讨论】:
-
因为它有 16 位。每个位可以保存 2 个值,因此 2^16 个可能的数字有 2 个字节
-
啊,当然,谢谢。
-
注意:对于每个 C,byte 至少 8 位。
-
你在使用古老的 DOS 编译器吗?或者你正在为一些嵌入式系统编译?现代 CPU 架构有 32 位 int,可以表示 2^32 个不同的值,无符号的范围是 0 到 2^32-1,有符号的 int 的范围是 -2^31 到 2^31-1
标签: python c++ c ctypes unsigned-integer