高見知英のかいはつにっし(β)

高見知英のアプリケーション開発日誌 のほか、地域活動などの活動報告ブログ。

Live Messengerの追加メッセージをいじる

とりあえず一段落ついていろいろいじってみましたが、何とか成功しました。
というのも、ほとんど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さんに手伝ってもらいましたが、相手側にも正常に表示されてるようです。

※2

ここのフォーマットはC#のものと一緒です。それ以降に指定した文字列を三つまで表示できます。
四つ以上指定すると({3}を指定すると)、不正な文字列だとみなされるようです。


後で考えたんですが、この検証コード、Delphiで書いた方が早かったんじゃないかなと(^_^;