Python Win32Gui自动化 - 发送WM_COPYDATA以从BSPlayer获取数据

时间:2012-11-08 15:14:34

标签: python automation sendmessage win32gui wm-copydata

我正在拼命尝试从我的脚本中自动化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; 

提前致谢!

1 个答案:

答案 0 :(得分:1)

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

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

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