我正在尝试让SendKeysTypes工作在py2.7和win7 64位上。Here is src
问题:
运行SendKeysCtypes.py,什么都没有发生。测试应该打开记事本并写一些文本。在
问题代码是:
def GetInput(self):
"Build the INPUT structure for the action"
actions = 1
# if both up and down
if self.up and self.down:
actions = 2
inputs = (INPUT * actions)()
vk, scan, flags = self._get_key_info()
for inp in inputs:
inp.type = INPUT_keyboard
inp._.ki.wVk = vk
inp._.ki.wScan = scan
inp._.ki.dwFlags |= flags
# if we are releasing - then let it up
if self.up:
inputs[-1]._.ki.dwFlags |= KEYEVENTF_KEYUP
return inputs
def Run(self):
"Execute the action"
inputs = self.GetInput()
return SendInput(
len(inputs),
ctypes.byref(inputs),
ctypes.sizeof(INPUT))
上面代码中的SendInput()不执行任何操作。在
其他测试
我尝试了this answer中的代码,它工作正常。但是这个密码 有其他问题。
SendInput() returns '0',意思是“被另一个阻止了” 线程“
打电话给ctypes.GetLastError()给我们error code 87,这意味着“ERROR\u INVALID_PARAMETER”
在这里我们陷入困境,因为我的windows编程非常有限,有人能解释一下吗?在
编辑1:
您使用的
Structure
和Union
类有两个问题。我将用the code you linked to中的一个类重新生成一个片段,如下所示:(我添加了修复程序以指出有问题的部分。)
第一种情况是您使用的是
_pack_ = 2
,这是不正确的。您根本不应该使用任何_pack_
对齐说明符。默认值在32位和64位Windows上都可以正常工作。在它与32位Windows上的
_pack_ = 2
一起工作纯粹是偶然的:代码中使用的所有2字节大小的数据类型成对出现,并且从已经对齐的边界开始,因此碰巧产生了与4字节对齐相同的结构。在但是,在64位窗口下,基本对齐是8字节,因此如果在那里使用
_pack_ = 2
或_pack_ = 4
,则结构将不对齐并具有错误的大小。在第二个问题是
ctypes.wintypes
中没有ULONG_PTR
,这将是dwExtraInfo
的正确数据类型。在32位Windows下,ULONG_PTR
是一个无符号的32位整数,而在64位Windows下,它是一个无符号的64位整数。在MSDN article about Windows Data Types显示了它的定义:
^{pr2}$因此,使用
DWORD
或ULONG
表示dwExtraInfo
,因此只在32位窗口下工作,否则会产生错误的大小。在虽然使用某些基于
POINTER
的数据类型会碰巧生成一个对齐和大小正确的结构,但无论在意义上还是在用法上都是错误的,因为ULONG_PTR
是“一个可以存储(casted)指针的无符号整数”,而不是实际的指针。在浏览
wintypes
,您会注意到WPARAM
的定义恰好与ULONG_PTR
的定义完全相同。因此,一个快速而肮脏(但仍然相当健壮)的方法是:或者,您可以使用一段受他们启发的代码,然后自己定义:
有了这些适应性,您可以定义如下结构:
相关问题 更多 >
编程相关推荐