程序对我在 Python 中使用 win32api 发送的消息没有反应

Posted

技术标签:

【中文标题】程序对我在 Python 中使用 win32api 发送的消息没有反应【英文标题】:The program not reacting to the message I sent with win32api in Python 【发布时间】:2021-06-10 16:31:42 【问题描述】:

每个人。

我试图通过远程控制一些程序来学习winapi/pywin32。所以我决定尝试一些不同的东西并选择The Powder Toy 进行测试。然后我以that answer为例,写了这个(也用Spy++来确定一些参数):

import win32gui
import win32con
import win32api
from time import sleep

hwndMain = win32gui.FindWindow(None, "The Powder Toy")

while True:
    win32api.PostMessage(hwndMain, win32con.WM_KEYDOWN, 0x44, 2097153)
    win32api.PostMessage(hwndMain, win32con.WM_KEYUP, 0x44, 0)
    sleep(1)

它需要 HWND,因为它应该是,也向 The Powder Toy 的窗口发送类似的消息,但由于某种原因它没有反应。例如:

当我按“d”时:

...WM_KEYDOWN nVirtKey:'D'cRepeat:1 ScanCode:20fExtended:0fAltDown:0fRepeat:0fUp:0
...WM_CHAR chCharCode:'100'(100)cRepeat:1 ScanCode:20fExtended:0fAltDown:0fRepeat:0fUp:0
...WM_KEYUP nVirtKey:'D'cRepeat:1 ScanCode:20fExtended:0fAltDown:0fRepeat:1fUp:1

当我尝试发送“d”时:

...WM_KEYDOWN nVirtKey:'D'cRepeat:1 ScanCode:20fExtended:0fAltDown:0fRepeat:0fUp:0
...WM_CHAR chCharCode:'100'(100)cRepeat:1 ScanCode:20fExtended:0fAltDown:1fRepeat:0fUp:0
...WM_KEYUP nVirtKey:'D'cRepeat:1 ScanCode:00fExtended:0fAltDown:1fRepeat:0fUp:0
...WM_CHAR chCharCode:'100'(100)cRepeat:1 ScanCode:00fExtended:0fAltDown:1fRepeat:0fUp:0

有人可以解释为什么它不起作用,如果可能的话,如何解决它?

【问题讨论】:

别再问同样的问题了。 You can't simulate keyboard input with PostMessage. 感谢您的客气话,@IInspectable。我使用 PostMessage,因为在那种情况下,SendMessage 和 PostMessage 都有同样的问题,同样的方式。问题出在它们的 lParameter 上。看起来我在那里发布了错误的代码部分,使用正确的 lParameters :) 我在原始代码上使用 lParameter 0 调用了 win32con.WM_KEYUP,这导致了一些问题。不过,还是谢谢你。您的评论让我更仔细地查看了我的代码。如果没有您的评论,我不会注意到 lParameters 的问题和重要性:) 【参考方案1】:

看来我必须将 ScanCode 和 0x44 一起提供给 WM_KEYUP 的 lParameters,才能使 The Powder Toy 工作。

【讨论】:

很高兴您得到了解决方案,感谢您的分享,如果您将它们标记为答案,我将不胜感激,这将对其他社区有益。

以上是关于程序对我在 Python 中使用 win32api 发送的消息没有反应的主要内容,如果未能解决你的问题,请参考以下文章

[python win32使用Windows Installer API失败,但perl正常-我在python中做错了什么?

转 Python使用win32api系统钩子

python可以直接调用win32的api吗

win32 API 编程

转 python win32api操作

Python win32api keybd_event alt 键卡住