とりあえず一段落ついていろいろいじってみましたが、何とか成功しました。
というのも、ほとんどCode Projectさんに答えが載っていたのですが。本当に何でも載ってますねえ、何か困ったときは参考にしなきゃ。
いろいろいじってみると、下記が最終形。ここには載っていないVarPtrメソッドは、Code Projectさんのものとおなじです。
private const string messangerClass = "MsnMsgrUIManager"; private const int LM_CHANGEMSG = 0x0547; private struct COPYDATASTRUCT { public int dwData; public int cbData; public int lpData; } // *中略* IntPtr hWnd = FindWindowEx(IntPtr.Zero, this.Handle, messangerClass, null); if(hWnd != IntPtr.Zero) { List<string> data = new List<string>(); data.Add("TestApplication"); // アプリケーション名 data.Add("Music"); // データタイプ ※1 data.Add("1"); // 曲開始・終了フラグ("1"を指定すると表示、"0"を指定すると表示が消えます) data.Add("{0} - {1}); // 表示フォーマット ※2 data.Add("曲名"); // 曲名 data.Add("アーティスト名"); // アーティスト data.Add("アルバム名"); // アルバム名 { COPYDATASTRUCT cds = new COPYDATASTRUCT(); string strData = string.Join("\\0", data.ToArray()) + "\0"; // 最後に\0を指定することがポイント cds.dwData = LM_CHANGEMSG; cds.lpData = VarPtr(strData); cds.cbData = strData.Length * 2; SendMessage(hWnd, WM_COPYDATA, this.Handle, ref cds); } } else { Chie.Dialog.Error("Window NotFound!"); }
間違えて不正な文字列を送ってしまったときには、Live Messengerに無視されますのでご注意を。
※1
ここにタイプ名を指定すると、メッセージの左に表示されるアイコンが変わります。リストがないので他にもあるかもしれませんが、とりあえずCode Projectさんにあるもの以外のものは見つかりませんでした。
- Music
- ヘッドホンのアイコン(「曲を表示する」時のアイコン)
- Games
- ゲームのアイコン(チェスの駒とトランプのエースのアイコン)
- Office
- Office2007のアイコン
なお、成功確認にid:hnwpkidsさんに手伝ってもらいましたが、相手側にも正常に表示されてるようです。