Python Automation Win32Gui - send WM_COPYDATA to receive data from BSPlayer

I am desperate to automate BSPlayer from my script. I managed to send simple command identifiers to the BSPlayer window (volume up / down, play / pause, etc.), however, I cannot return the file name.

Here is the BSPlayer API. I was able to emulate the first parts in python, however WM_COPYDATA does not work.

Here is my Python code:

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

Obviously .lpData returns "" ...

I'm trying to imitate:

 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; 

To be more detailed, I am trying to get the file name from the BSPlayer window. To do this, I try to imitate the code above. I expect a buffer of some type to be filled with my desired string, but it will be empty. So, again, I want the equivalent Python code above.

For example, this code has been emulated successfully:

 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; 

Thanks in advance!

+1
source share
1 answer

You cannot replicate this WM_COPYDATA to your Python code. It can only be used in proc, for example, for plugins.

The Delphi sample code is written under the assumption that the WM_COPYDATA call is made from the same process as the window that receives the message. This is because WM_COPYDATA used to copy a pointer, and pointers are only valid inside the process that allocates memory. You cannot send a pointer to a process boundary.

In my opinion, interface designers are abusing WM_COPYDATA . It is designed to solve the exact problem of transferring data between processes. This is the easiest, easiest interprocess communication. To then use it to move the pointer, it rather defeats the process.

+1
source

Source: https://habr.com/ru/post/1343049/


All Articles