【问题标题】:Python Win32Gui automation - Send WM_COPYDATA to get data from BSPlayerPython Win32Gui 自动化 - 发送 WM_COPYDATA 从 BSPlayer 获取数据
【发布时间】:2012-11-08 15:14:34
【问题描述】:

我正在拼命尝试从我的脚本中自动化 BSPlayer。 我成功地将简单的命令 ID 发送到 BSPlayer 窗口(音量增大/减小、播放/暂停等),但是我无法取回文件名。

Here 是 BSPlayer API。 我能够在 python 中模拟第一部分,但是 WM_COPYDATA 不起作用。

这是我的 Python 代码:

copyDataCmd = COPYDATASTRUCT()
copyDataCmd.dwData = self.BSP_GetFileName
copyDataCmd.lpData = ""
copyDataCmd.cbData = 4                
win32gui.SendMessage(self.playerWindowHandler, win32con.WM_COPYDATA, 
                     ownHandler, copyDataCmd);

显然 .lpData 返回 "" ...

我要模仿的内容:

cds:TCOPYDATASTRUCT; 
buf:array[0..MAX_PATH-1] of char; 
adr:pointer; // 
adr:=@buf; 
cds.dwData:=BSP_GetFileName; 
cds.lpData:=@adr; 
cds.cbData:=4; 
SendMessage(bsp_hand,WM_COPYDATA,appHWND,lParam(@cds)); 
// available in BSPlayer version 0.84.484+ // 
// appHWND is calling application window handle 
// File name will be copied to buf // 
// Get open file name 
BSP_GetFileName = $1010B;

更详细地说,我试图从 BSPlayer 窗口中获取文件名。为此,我试图模拟上面的代码。我希望某种类型的缓冲区被我想要的字符串填充,但它是空的。 所以,再次,我想要上面代码的 Python 等价物。

例如成功模拟了这段代码:

status := SendMessage(bsp_hand,WM_BSP_CMD,BSP_GetStatus,0); 
// available in BSPlayer version 0.84.484+ // 
// Return player status // 0 - STOP // 1 - PAUSE 
// 2 - PLAY // 4 - No movie   open        
BSP_GetStatus = $10102; 

提前致谢!

【问题讨论】:

  • 您尝试模拟的代码不起作用。它不能工作。它正在向另一个进程发送一个指向缓冲区指针的指针。那是间接的一级太远了。您需要一个有效的样本。
  • @DavidHeffernan 我能够在该页面上模拟另一个代码(参见问题)。
  • Pascal 码需要将@buf 分配给lpData,将MAX_PATH*SizeOf(Char) 分配给cbData。然后它将被正确编组。那段代码的开发人员几乎可以肯定只在进程中进行了测试。
  • @DavidHeffernan 你在第一部分可能是对的。但是,将 4 分配给 cbData 可能是指针的大小 - 这是固定的,仅取决于您机器的内存地址单元长度(在他们的情况下可能为 4)。
  • 您不能从不同的进程进行该调用。它将从相同的过程中工作。所以,插件很好,但我猜你不是在写插件。我猜您的代码在与bsp_hand 窗口不同的进程中运行。

标签: python automation sendmessage win32gui wm-copydata


【解决方案1】:

您无法在 Python 代码中复制 WM_COPYDATA。它只能在进程内使用,例如插件。

示例 Delphi 代码是在假设对 WM_COPYDATA 的调用与接收消息的窗口来自同一进程的情况下编写的。这是因为WM_COPYDATA 用于复制指针,并且指针仅在分配内存的进程内有效。您不能跨进程边界发送指针。

在我看来,界面的设计者在滥用WM_COPYDATA。它旨在用于解决进程之间传输数据的确切问题。它是可用的最简单最轻量级的进程间通信。然后使用它来传输指针而不是破坏该过程。

【讨论】:

  • 猜他们确实滥用了它。然而值得称赞的是,他们确实指定它是从插件中使用的——但我当时不明白。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-01-27
  • 1970-01-01
  • 1970-01-01
  • 2022-08-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多