RSS Feed

更改msn messenger个人消息程序的源码

2005-08-10 by bborn

很简单的一个用sdk写的c++程序

这是头文件的部分 声明一下函数

#include “resource.h”
#include

BOOL CALLBACK DlgProc(HWND hwnd, UINT iMsg, WPARAM wParam, LPARAM lParam);
void ChangeUserMsg(bool bshow, int x,const WCHAR* str);

LRESULT CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam);

这是前面的一些必要的声明

#define MSNMusicString L”\\0%s\\0%d\\0[%s]\\0″
bool bshow = 0;
HINSTANCE hInst;
NOTIFYICONDATA IconData;
int msna,msnb;
#define WM_MYTRAY WM_USER+99

主要的函数

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd)
{

hInst = hInstance;

DialogBoxParam(hInst, (LPCSTR)IDD_DIALOG1, NULL, DlgProc, NULL);
return 0;
}

BOOL CALLBACK DlgProc(HWND hwnd, UINT iMsg, WPARAM wParam, LPARAM lParam)
{
HICON hIcon;
HWND hact;
WCHAR  temp[256];

switch(iMsg)
{
case WM_INITDIALOG:
hIcon = LoadIcon(hInst, (LPCSTR)IDI_ICON1);
SendMessage(hwnd, WM_SETICON, (WPARAM)ICON_BIG, (LPARAM)hIcon);
SendMessage(hwnd, WM_SETICON, (WPARAM)ICON_SMALL, (LPARAM)hIcon);
CheckDlgButton(hwnd,IDC_RADIO1,BST_CHECKED);  msnb=1;
CheckDlgButton(hwnd,IDC_RADIO4,BST_CHECKED);  msna=1;
break;

case WM_TIMER:
if (wParam==1)
{
hact=GetForegroundWindow();
GetWindowTextW (hact,temp,256);
ChangeUserMsg(1,msnb,temp);
}
break;

case WM_MYTRAY :
if (lParam==WM_LBUTTONDOWN)
{
Shell_NotifyIcon(NIM_Delete, &IconData);
ShowWindow(hwnd,1);
}
break;

case WM_COMMAND:
switch(LOWORD(wParam))
{
case IDOK:
msna=IsDlgButtonChecked(hwnd,IDC_RADIO6);
if(msna==1)
{
KillTimer(hwnd,1);
ChangeUserMsg(0,0,0);
}
else
{
if(IsDlgButtonChecked(hwnd,IDC_RADIO1)==1)  msnb=1;
if(IsDlgButtonChecked(hwnd,IDC_RADIO2)==1)  msnb=2;
if(IsDlgButtonChecked(hwnd,IDC_RADIO3)==1)  msnb=3;
SetTimer(hwnd,1,2000, 0);
}
IconData.cbSize = sizeof(NOTIFYICONDATA);
IconData.hWnd  = hwnd;
IconData.uID = 12;
IconData.hIcon  = LoadIcon(hInst, MAKEINTRESOURCE(IDI_ICON1));
IconData.uFlags = NIF_MESSAGE + NIF_ICON + NIF_TIP;
IconData.uCallbackMessage = WM_MYTRAY;
strcpy(IconData.szTip, “自定义Msn Messenger的个人消息”);
Shell_NotifyIcon(NIM_ADD, &IconData);
ShowWindow(hwnd,0);
break;
case IDCANCEL:
KillTimer(hwnd,1);
Shell_NotifyIcon(NIM_Delete, &IconData);
ChangeUserMsg(0,0,0);
EndDialog(hwnd, 0);
break;
case IDC_ABOUT:
DialogBox(hInst, (LPCTSTR)IDD_ABOUTBOX, hwnd, (DLGPROC)About);
break;

default:
return TRUE;
}

default:
return FALSE;
}
}

// Mesage handler for about box.
LRESULT CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
switch (message)
{
case WM_INITDIALOG:
return TRUE;

case WM_COMMAND:
if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL)
{
EndDialog(hDlg, LOWORD(wParam));
return TRUE;
}
break;
}
return FALSE;
}

下面是主要功能的实现

void ChangeUserMsg(bool bshow, int x, const WCHAR*  str)
{
COPYDATASTRUCT msndata;
WCHAR buffer[500];
WCHAR style[5];

if(x==1)
{wsprintfW(style,L”Office”);}
else if (x==2)
{wsprintfW(style,L”Music”);}
else
{wsprintfW(style,L”Games”);}

//bool bshow = 1;

wsprintfW(buffer, MSNMusicString,  style, bshow , str );

HWND msnui = NULL;
msndata.dwData = 0×547;
msndata.lpData = &buffer;
msndata.cbData = (lstrlenW(buffer)*2)+2;
msnui = FindWindowEx(NULL, msnui, “MsnMsgrUIManager”, NULL);

if (msnui!=0)
{
SendMessage(msnui, WM_COPYDATA, 0, (LPARAM)&msndata);
}
}

主要的问题出在WCHAR这个类型上
开始不知道怎么处理怎么传递怎么赋值怎么复制等
还有一个就是托盘图标
很简单的实现,但是在填充数据结构的时候
IconData.hIcon = LoadIcon(hInst, MAKEINTRESOURCE(IDI_ICON1));
把LoadIcon的第一个参数设为0了,图标怎么都显示不出来
看别人的程序有这样写的,不知道是不是说错了
找原因找了半天 还以为是自己做的图标的问题
图标并不一定要是16×16的

可能相关


7 条评论 »

  1. jemissary 说道:

    bborn兄能不能把完整代码贴出来或者能不能发个邮件给我?

  2. jemissary 说道:

    我的邮箱mail_lieom@163.com

  3. jemissary 说道:

    谢谢bborn兄提供的源码,我已经顺利调试通过了。

  4. echo 说道:

    可以把源码发给我看下不~ 谢谢

    fengzhilei99@163.com

  5. onebird 说道:

    能不能发完整的源码给我一份 谢谢:)
    onebird __@__ gmail.com 或 yimzhang __@__ microsoft.com

  6. ZhuXingyin 说道:

    能不能把源码发我看一下,不甚感谢
    xingyinzhu@gmail.com

发表评论

电子邮件地址不会被公开。

您可以使用这些 HTML 标签和属性: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> <pre lang="" line="" escaped="" highlight="">