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

Python Win32Gui自动化-发送WM_COPYDATA以从BSPlayer获取数据,python,automation,sendmessage,win32gui,wm-copydata,Python,Automation,Sendmessage,Win32gui,Wm Copydata,我拼命想从我的脚本中自动化BSPlayer。 我成功地将简单的命令ID发送到BSPlayer窗口(音量增大/减小、播放/暂停等),但无法恢复文件名 是BSPlayer API。 我能够在python中模拟第一部分,但是WM_COPYDATA不起作用 以下是我的Python代码: copyDataCmd = COPYDATASTRUCT() copyDataCmd.dwData = self.BSP_GetFileName copyDataCmd.lpData = "" copyDataCmd.c

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

是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; 

提前谢谢

您不能在Python代码中复制该
WM_COPYDATA
。它只能在proc中使用,例如用于插件

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


在我看来,界面设计者正在滥用
WM\u COPYDATA
。它旨在解决进程之间传输数据的确切问题。它是最简单、最轻量级的进程间通信。然后使用它来传输指针会破坏进程。

您不能在Python代码中复制该
WM_COPYDATA
。它只能在proc中使用,例如用于插件

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


在我看来,界面设计者正在滥用
WM\u COPYDATA
。它旨在解决进程之间传输数据的确切问题。它是最简单、最轻量级的进程间通信。然后使用它来传输指针会使进程失败。

您试图模拟的代码不起作用。它不能工作。它向另一个进程发送指向缓冲区的指针。这是一个间接的层次太远了。您需要一个有效的示例。@DavidHeffernan我能够在该页面上模拟另一个代码(请参见问题中)。Pascal代码需要将
@buf
分配给
lpData
,并将
MAX_PATH*SizeOf(Char)
分配给
cbData
。然后它将被正确地编组。这段代码的开发人员几乎肯定只在过程中进行了测试。@DavidHeffernan第一部分你可能是对的。但是,将4分配给cbData可能是指针的大小-这是固定的,仅取决于计算机的内存地址单元长度(在它们的情况下可能是4)。您不能从其他进程进行该调用。它将从相同的过程中工作。所以,对于一个插件来说这很好,但我想你不是在写插件。我猜您的代码运行在与
bsp\u hand
窗口不同的进程中。您试图模拟的代码不起作用。它不能工作。它向另一个进程发送指向缓冲区的指针。这是一个间接的层次太远了。您需要一个有效的示例。@DavidHeffernan我能够在该页面上模拟另一个代码(请参见问题中)。Pascal代码需要将
@buf
分配给
lpData
,并将
MAX_PATH*SizeOf(Char)
分配给
cbData
。然后它将被正确地编组。这段代码的开发人员几乎肯定只在过程中进行了测试。@DavidHeffernan第一部分你可能是对的。但是,将4分配给cbData可能是指针的大小-这是固定的,仅取决于计算机的内存地址单元长度(在它们的情况下可能是4)。您不能从其他进程进行该调用。它将从相同的过程中工作。所以,对于一个插件来说这很好,但我想你不是在写插件。我猜你的代码运行在与
bsp\u hand
窗口不同的进程中。我猜他们确实滥用了它。然而值得赞扬的是,他们确实指定它是从一个插件中使用的-但是我当时不理解它。我猜他们确实滥用了它。然而,值得赞扬的是,他们确实指定它是从插件中使用的——但是当时我不理解它。