很简单的一个用sdk写的c++程序
这是头文件的部分 声明一下函数
#include “resource.h”
#includeBOOL 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的

