1

私は必死にスクリプトから BSPlayer を自動化しようとしています。BSPlayer ウィンドウに単純なコマンド ID を送信することには成功しましたが (ボリュームのアップ/ダウン、再生/一時停止など)、ファイル名を取り戻すことはできません。

これが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; 

前もって感謝します!

4

1 に答える 1

1

WM_COPYDATAPython コードでそれを複製することはできません。プラグインなど、インプロセスでのみ使用できます。

WM_COPYDATAサンプルの Delphi コードは、メッセージを受け取るウィンドウと同じプロセスからへの呼び出しが行われるという前提で書かれています。これWM_COPYDATAは、 がポインターのコピーに使用され、ポインターがメモリを割り当てたプロセス内でのみ有効であるためです。プロセス境界を越えてポインターを送信することはできません。

私の意見では、インターフェイスの設計者はWM_COPYDATA. プロセス間でデータを転送するという正確な問題を解決するために使用することを意図しています。これは、利用可能な最も単純で軽量なプロセス間通信です。それを使用してポインターを転送すると、プロセスが無効になります。

于 2012-11-09T13:29:22.957 に答える