Windows Media PlayerとLive Messengerを使って、再生中の音楽情報にLive Messengerの表示メッセージを変える機能があるよね。Windows Media Player側では、Windows Live Messenger ミュージック プラグインという名前が付いています。

image

 これを自アプリケーションから変えようって話し。この機能はMSN Messengerと呼ばれていた時代からありまして……、答えは MsnMsgrUIManager でググれ! はい、終了。嘘です。私は、ググって 長時間はまってしまったので少し書いておきます。

 まずは、たいへん参考になるページ。ほんと検索したらいっぱい出ます。

 方法は、MsnMsgrUIManager というクラス名を持つウィンドウにCOPYDATASTRUCT構造体のデータをSendMessageを使ってメッセージを送信します。

 詳しくは各ページでってことで、いきなりVB.NETのコードを置いておきます。続きはコードの後に。

Imports System.Runtime.InteropServices

Public Class PersonalMessage
    Private Const WM_COPYDATA As Integer = &H4A

    Public Enum MessageType
        Music
        Games
        Office
    End Enum

    <StructLayout(LayoutKind.Sequential)> _
    Structure COPYDATASTRUCT
        Public dwData As Int32
        Public cdData As Int32
        Public lpData As IntPtr
    End Structure

    <DllImport("user32")> _
    Private Shared Function SendMessage(ByVal hWnd As IntPtr, ByVal msg As Integer, ByVal wParam As IntPtr, ByRef lParam As COPYDATASTRUCT) As Integer
    End Function

    <DllImport("user32")> _
    Private Shared Function FindWindowEx(ByVal parentHandle As IntPtr, ByVal childAfter As IntPtr, ByVal lclassName As String, ByVal windowTitle As String) As IntPtr
    End Function

    Public Shared Sub Show(ByVal applicationName As String, ByVal type As MessageType, ByVal format As String, ByVal parameters() As String)
        Dim list = New List(Of String)
        list.Add(applicationName)
        list.Add(type.ToString)
        list.Add("1")
        list.Add(format)
        list.AddRange(parameters)

        ChangeMessage(String.Join("\0", list.ToArray) & "\0\0" & vbNullChar)
    End Sub

    Public Shared Sub Delete(ByVal applicationName As String, ByVal type As MessageType)
        Dim list = New List(Of String)
        list.Add(applicationName)
        list.Add(type.ToString)
        list.Add("0")

        ChangeMessage(String.Join("\0", list.ToArray) & "\0\0" & vbNullChar)
    End Sub

    Private Shared Sub ChangeMessage(ByVal message As String)
        Dim messengers = New List(Of IntPtr)
        Dim chiledAfter = IntPtr.Zero
        Do
            chiledAfter = FindWindowEx(IntPtr.Zero, chiledAfter, "MsnMsgrUIManager", Nothing)
            If chiledAfter <> IntPtr.Zero Then
                messengers.Add(chiledAfter)
            End If
        Loop Until (chiledAfter = IntPtr.Zero)

        If messengers.Count = 0 Then
            Exit Sub
        End If

        Dim cds As New COPYDATASTRUCT With { _
            .dwData = 1351, _
            .cdData = System.Text.Encoding.Unicode.GetByteCount(message), _
            .lpData = Marshal.StringToHGlobalUni(message)}

        For Each m In messengers
            SendMessage(m, WM_COPYDATA, IntPtr.Zero, cds)
        Next

        Marshal.FreeHGlobal(cds.lpData)
    End Sub
End Class

 メソッド名や引数がいまいちな感じがしてるコードなので、あまり参考にはしないでください。すごい単純ぽいんだけど、これにすごいはまりました。64bit環境で開発している場合は、ターゲットCPUはx86にして実行しましょう! 気づくのにだいぶかかりましたよ。

 あと、MsnMsgrUIManager はなんらかの原因で落ちてない場合もあるようです。Live Messengerを再起動しましょう。また、MsnMsgrUIManager というクラス名を持つソフトを作って、Windows Media Playerなどからの情報を受け取るアプリもあるようです。そのようなのも考慮してあげると MsnMsgrUIManager を持つウィンドウすべてにメッセージ送るのが良いかもしれません。上のコードではそうしてます。

 これを調べようと思ったのは、表示メッセージにリンクを表示できないかという質問が某フォーラムにあったからです。結論からいうと無理みたいですね。通常の表示メッセージもできませんし、この外部アプリから設定も単に文字列を指定できるだけです。メッセージの種類として音楽、ゲーム、Officeが選べ、音楽の場合のみリンクとして表示されます。リンクをクリックするとWindows Media PlayerかLive Messengerの設定によりオンラインショップでの検索か、Live Searchの検索になるようです。ここを利用すると単語の検索には使えそうですがイマイチ有用な感じではありませんね。

フィードバック

# [MysticSL] うほっ いいライブラリ…

2008/07/15 22:20 by 鶏のプログラミング揚げ
[MysticSL] うほっ いいライブラリ…

# 再生中の曲を取得 by Messenger Library

2008/07/31 22:07 by katamari.wankuma.com
再生中の曲を取得 by Messenger Library

# Windows Media Player with 伺か

2008/11/04 1:01 by katamari.wankuma.com
Windows Media Player with 伺か

# re: Live Messenger 表示メッセージを外部アプリから設定

2013/02/17 20:15 by Kirn Gill
An English language document describing this interface in more detail can be found here: http://code.google.com/p/psymp3/wiki/MsnMsgrUiManager

より詳細には、このインタフェースを記述英語ドキュメントが提供されたURLで見つけることができます。

# ルイヴィトンコピー

2018/09/27 7:42 by mbjrfi@docomo.ne.jp
弊店では信用第一主義を徹底しており社員全員下記の方針のもとに頑張っています。
1.不適合品を入荷しない。
厳しく受け入れ検査を行い、お客様に満足いただける品質のいい物だけを入荷する。
2.不適合品を出荷しない。
出荷前に細部まで二重確認を行い、お客様からご注文頂いた商品を納期通り出荷する。
3.お客様からのクレームゼロ
お客様第一主義を徹底し、お客様からのお問い合わせ、苦情等に対して積極的かつ丁寧に対応いたします。

# ブランド通販店

2019/09/17 7:37 by Georgefipse
弊社は各ランクのブランド商品満載し、ブランド通販店で一番信用のある店なので!。
品質はこちらが間違いなく保証します。
https://www.ginzaoff.com

■取扱ブランド ロレックス時計コピー、カルティエ時計コピー、IWC時計コピー、
ブライトリング時計コピー、パネライ時計コピー.
◆ スタイルが多い、品質がよい、価格が低い、実物写真!
◆ ご入金頂いてから最速4日、遅くとも7日程度でご指定場所へ発送出来る予定でございます
◆ 商品送料を無料にいたします

◆信用第一、良い品質、低価格は 私達の勝ち残りの切り札です。
◆ 当社の商品は絶対の自信が御座います。
◇ N品質 シリアル付きも有り 付属品完備!

◆ 必ずご満足頂ける品質の商品のみ販売しております。
◇ 品質を最大限本物と同等とする為に相応の材質にて製作している為です。
◆ 絶対に満足して頂ける品のみ皆様にお届け致します。

興味あれば、是非一度サイトをご覧になって下さい。
今後ともよろしくご愛顧くださいますよう、お願い申し上げます
https://www.ginzaoff.com
お取り引きを開始させていただきたく思います。
詳細に関してはどうぞお気軽にご連絡ください。

# ブランド偽物

2023/03/21 17:01 by mrbqdgxwc@excite.co.jp
注文してから届くまで2日間と、迅速な対応ありがとうございました。
また、ご丁寧にメッセージまでありがとうございます。
初めて新品を買いましたが、価格・品物とも納得出来る商品でした。
プレミアさんにお願いで、もう少し品数があれば良いなと思いました。
★コーチ コーチ★シグネチャーストライプタータントップハンドルポーチ★アクセサリーポーチ★F44166★キャンバス×パテントレザー★ピンク系マルチカラー×ブラック★
タータン柄にひと目ぼれしました。とてもかわいいです。
ポーチなので小さめかな?と思っていたら結構まちもあり、ちょっとしたお出かけに重宝しそうです。
ブランド偽物 https://www.gmt78.com/product/detail/887.htm
コメントの入力
タイトル
 
名前
 
Url
コメント