2008年7月15日

 Windows Live Writer Technical Preview VersionをメインPCにインストールした。このバージョンは先月リリースされています。そのときに書いた記事はこれ「Windows Live Writer Technical Preview」。Virtual PCとノートPCにはPreview Versionを入れていたのだけど、メインPCは日本語版のままでした。Preview Versionとはいえ かなり使いやすくなってるのでメインもこれにしちゃいました。新しいSDKでプラグイン部分などもきちんとみていきたいと思ってる。

 これも前に書いたTipsだけど、起動時に /culture:ja と引数に指定しておくとカルチャ情報が日本語として起動される。日本語リソースに対応したプラグインは日本語で表示されます(まずないけど)。

Windows Live Writerのプロパティ

 

 WLW Preview Version 関連記事がある注目Blog(日本語)

posted @ 1:05 | Feedback (0)

 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の検索になるようです。ここを利用すると単語の検索には使えそうですがイマイチ有用な感じではありませんね。

posted @ 0:38 | Feedback (12)

 届いてました。紙のが。MSDNサブスクリプション登録時に安いし購読しておいたのだけど、今回で購読期間が切れるみたい。ほとんど読まずに放置してるので(日本語情報もあるしw)、次はないかなーと思ってる。あと、たぶん手元に届くまでにだいぶ時間かかってるよね。

MSDN Magazine

 今回の内容、System.AddInの話題があるじゃないですか! これは後でチェックだー。日本語のWebページの方は、まだ訳されてないってことなんでしょうか。表紙の写真は最新だけど記事は違うぞ。

posted @ 0:37 | Feedback (0)