やっと出来た
MSN MessengerはVer7になってから現在再生中の曲名を表示させることが出来るようになりました
標準ではWMP9~とiTunesで再生中の曲名を表示出来るようです
また、Winamp等も公開されているプラグインを使う事で表示出来るようです
しかし、私が再生に使ってるソフトは自作のソフト(VB製)です
最初にVBで表示を変えられないか試したのはMSN Messenger Ver7が正式公開直後
ネットで調べたら英語版ではCでもVBでも出来る事が判明したので、そのソースを動かしてみる…沈黙
変数宣言をDimからPublicに変更したりしてもダメ…やる気がなくなったので放置
その後Winamp用のプラグインが公開されたので再度チャレンジ
このプラグインにはソースファイルが添付されていたので(もちろんCだけど)そのままVBに移植…沈黙
\\0の所を(Cでは\がエスケープされる(?)ので\0になるけど)vbNullCharにしたりしてもダメ
実際にどんなデータが送信されているのか調べてみる事に
WMPで再生させてspy++でメッセージを取得、VBでそのアドレスにあるデータの中身をみようとしたら「アクセス違反」
ちょっとくらい見せてくれてもええやん!とか思いつつも覗き見は諦める……
ゲームや仕事をしつつ原因を考え、メッセンジャー側から変数の中身が見えてないんじゃないかな~?という結論に達して、GlobalAllocで確保したメモリならOKじゃないか?と推測
そして本日チャレンジ!……結果、すんなりOK~
そうか…Cでの変数は別のプロセスからでも見られるのに、VBは見られないのか……
DLLに渡すときは通常の変数宣言で問題なかったから出来るとばかり思ってた……
では出来たソースを下に公開します
但し、エラー処理等は省略してあるので(実際に私が使ってるのにも入ってない)何が起きるか分かりませんので、それだけはご注意を
このソースを標準モジュールにコピペして、「Send_Messenger "表示したい文字",True」で表示されます
消すときは「Send_Messenger "",False」です
strMsgの最初の「JBA-soft」は適当でOKだと思います、その次のMusicは変えない方がよさそう
ちなみにWMP9以降を使わなくてもインストールしておかないと表示出来ないらしいです(メッセンジャー側で「"再生中の曲"を表示」が有効にならないとか…)
Private Type COPYDATASTRUCT
dwData As Long
cbData As Long
lpData As Long
End Type
Private Const CP_ACP = 0
Private Const MB_PRECOMPOSED = &H1
Private Const MAGIC_NUMBER = &H547
Private Const WM_COPYDATA = &H4A
Private Const GMEM_FIXED = &H0
Private Const GMEM_ZEROINIT = &H40
Private Declare Function GlobalAlloc Lib "kernel32" (ByVal wFlags As Long, ByVal dwBytes As Long) As Long
Private Declare Function GlobalFree Lib "kernel32" (ByVal hMem As Long) As Long
Private Declare Function SendMessage Lib "USER32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Private Declare Function FindWindow Lib "USER32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Private Declare Function MultiByteToWideCharL Lib "kernel32" Alias "MultiByteToWideChar" (ByVal CodePage As Long, ByVal dwFlags As Long, ByVal lpMultiByteStr As String, ByVal cchMultiByte As Long, ByVal lpWideCharStr As Long, ByVal cchWideChar As Long) As Long
Public Sub Send_Messenger(ByVal Message As String, ByVal Flag As Boolean)
Dim strMsg As String, strFlag As String
Dim hGM As Long
Dim msnui As Long
Dim msndata As COPYDATASTRUCT
If Flag = True Then strFlag = "1" Else strFlag = "0"
strMsg = "JBA-soft\0Music\0" + strFlag + "\0" + Message + "\0"
hGM = GlobalAlloc(GMEM_FIXED Or GMEM_ZEROINIT, LenB(strMsg) * 2)
MultiByteToWideCharL CP_ACP, MB_PRECOMPOSED, strMsg, -1, hGM, LenB(strMsg)
With msndata
.dwData = MAGIC_NUMBER
.lpData = hGM
.cbData = LenB(strMsg) * 2
End With
msnui = FindWindow("MsnMsgrUIManager", "")
SendMessage msnui, WM_COPYDATA, 0, VarPtr(msndata)
GlobalFree hGM
End Sub