MSN Live Messenger的“正在收听的内容”如何自定义?
WMP和MSN Live Messenger配合着让其他联系人看到自己的“正在收听的内容”这个功能,相信大家都用过。我一直想把自己想说的话加进取,这样就可以滚动了。
怎么实现呢?
其实用到的是这个WM_COPYDATA
贴一段C#的代码,大家可以加到自己的项目中:
Win32.cs
using System;
using System.Runtime.InteropServices;
namespace MSN.Win32
{
/// <summary>
/// Win32API提供交互
/// </summary>
public class Win32API
{
public const int WM_COMMAND = 0x111;
public const short WM_COPYDATA = 74;
public struct COPYDATASTRUCT
{
public int dwData;
public int cbData;
public int lpData;
}
/// <summary>
/// 获得指定对象的内存地址
/// </summary>
/// <param name="e">对象</param>
/// <returns>内存地址</returns>
public static int GetObjectMemoryAddress(object e)
{
GCHandle GC = GCHandle.Alloc(e,GCHandleType.Pinned);
int gc = GC.AddrOfPinnedObject().ToInt32();
GC.Free();
return gc;
}
public static int ChangeMSNSong(bool enable, string message,string category)
{
int iHandle=0;
int iReturn=-1;
string msnMsg="\\0" + category + "\\0" + (enable ? "1" : "0") + "\\0{0}\\0" + message + "\\0\\0\\0\\0\0";
//Find the MSN
iHandle=Win32API.FindWindow("MsnMsgrUIManager",string.Empty);
Win32API.COPYDATASTRUCT copydatastruct = new MSN.Win32.Win32API.COPYDATASTRUCT();
copydatastruct.dwData=0x0547;
copydatastruct.cbData=msnMsg.Length * 2;
copydatastruct.lpData=Win32API.GetObjectMemoryAddress(msnMsg);
if(iHandle>0)
iReturn = Win32API.SendMessage(iHandle,Win32API.WM_COPYDATA,0,Win32API.GetObjectMemoryAddress(copydatastruct));
return iReturn;
}
public enum MSN_CATAGROY
{
Games,
Music
}
public Win32API()
{
}
[DllImport("User32.dll")]
public static extern int FindWindow(string strClassName,
string strWindowName);
[DllImport("User32.dll")]
public static extern int FindWindowEx(int hwndParent,
int hwndChildAfter,
string strClassName,
string strWindowName);
[DllImport("User32.dll")]
public static extern Int32 SendMessage(
int hWnd, // handle to destination window
int Msg, // message
int wParam, // first message parameter
[MarshalAs(UnmanagedType.LPStr)] string lParam);
// second message parameter
[DllImport("User32.dll")]
public static extern Int32 SendMessage(
int hWnd, // handle to destination window
int Msg, // message
int wParam, // first message parameter
int lParam); // second message parameter
}
}
调用的时候直接用这个方式:
Win32API.ChangeMSNSong(true,
((DataSource)this.dataGrid1.DataSource).Tables[0].Rows[i]["信息"].ToString(),
((DataSource)this.dataGrid1.DataSource).Tables[0].Rows[i]["类别"].ToString());