本文不是一篇“如何做”的教程,因为代码设计并不完美。可以将其视为对本网站的贡献。它提供了代码重用的例子,以及一个现成的应用程序来检查邮件。GUI界面使用法语,可以通过编辑对话框、菜单和字符串资源,轻松地将其转换为选择的语言。
应用程序做什么?
MailCheck应用程序使用默认配置文件连接到Exchange服务器。然后它显示一个对话框,告诉是否有新邮件。当关闭该窗口时,它将自己最小化到系统托盘。当新邮件到达时,系统托盘中的图标会改变,并且会发出提示音。一旦恢复了对话框窗口,新邮件就被视为已检查,图标再次改变。附加到托盘图标的菜单提供了运行Outlook的选项。
致谢
代码的一部分来自Microsoft基础类库:Wakeme by Vajira Weerasekera。它涉及到连接到Exchange服务器并检查收件箱的所有MAPI内容。另一部分代码来自Daniel Zilcsak。可以在本网站上阅读他的精彩文章“系统托盘图标- 将应用程序最小化到托盘”。图标是从Valeriy Ovechkin的优秀POP检查器Magic Mail Monitor复制的。
丑陋的工作
只是按照Daniel Zilcsak的指导,使用他的CTrayIcon类。创建了MFC项目,使用基于对话框的应用程序。应用程序的类是CMailCheckApp,对话框的类是CMailCheckDlg。改变了CMailCheckDlg,使其派生自CTrayDialog。然后将Microsoft的示例CWakemeApp粘贴进去,并删除了所有与GUI相关的代码。向CWakemeApp添加了一个名为dlg的成员变量,以便在创建Wakeme应用程序时创建对话框。最后,在CMailCheckApp::InitInstance中创建了Wakeme应用程序实例,而不是CMailCheckDlg,并且调用了theWakeme.dlg.DoModal()。就是这样!(告诉过这很丑陋)。当然,添加了必要的代码来处理GUI。
唯一的真正贡献是编码找到Office应用程序(Outlook)的路径的方式。让更仔细地看看这部分,可能会发现它更有趣:
CString CMailCheckDlg::GetOutlookPath()
{
// 如果找不到任何东西,
// 让至少尝试默认安装路径
const CString defaultPath = "C:\\Program Files\\Microsoft Office\\Office\\Outlook.exe";
HKEY hKey;
TCHAR szCLSID[255];
TCHAR szPath[255];
DWORD dwBufLen = 255;
LONG lRet;
// 查找Microsoft的Outlook的CLSID。
// 也可以在这里使用Excel.Application,
// Word.Application等。无论在注册表中找到什么。
if (RegOpenKeyEx(HKEY_LOCAL_MACHINE,
TEXT("Software\\Classes\\Outlook.Application\\CLSID"),
0,
KEY_QUERY_VALUE,
&hKey) != ERROR_SUCCESS)
return defaultPath;
lRet = RegQueryValueEx(hKey,
NULL,
NULL,
NULL,
(LPBYTE)szCLSID,
&dwBufLen);
RegCloseKey(hKey);
if (lRet != ERROR_SUCCESS)
return defaultPath;
dwBufLen = 255;
// 现在读取找到的CLSID的注册表。
// LocalServer32下的默认键是
// 安装路径。
CString key = "Software\\Classes\\CLSID\\" + CString(szCLSID) + "\\LocalServer32";
if (RegOpenKeyEx(HKEY_LOCAL_MACHINE,
key,
0,
KEY_QUERY_VALUE,
&hKey) != ERROR_SUCCESS)
return defaultPath;
lRet = RegQueryValueEx(hKey,
NULL,
NULL,
NULL,
(LPBYTE)szPath,
&dwBufLen);
RegCloseKey(hKey);
if (lRet != ERROR_SUCCESS)
return defaultPath;
return szPath;
}
这段代码展示了如何在Windows注册表中查找Outlook应用程序的路径。首先,它尝试打开Outlook.Application的CLSID键。如果找不到,它将返回默认的Outlook安装路径。然后,它查询该键的值,以获取Outlook的CLSID。接下来,它使用这个CLSID来查找Outlook的安装路径。如果找不到路径,它将返回默认路径。