简介
这个项目的目的是制定一个提醒的应用程序,它可以存储多个提醒和将显示一个消息框,由用户指定的时间。应用程序可以启动Windows,或者用户也可以手动启动它。应用程序菜单提供此选项。应用程序使用Windows注册表中存储的提醒信息。我已经创建了几个简单的API,可用于在其他应用程序,如直接加入注册表,搜索数据,将数据添加到列表视图控制我用列表视图上点击鼠标通知等,将读取所有的点击鼠标的特定行的信息。我已经加入系统托盘通知和状态栏的代码以及。主要工作是管理注册表,并在列表视图控件的提醒搜索。我还实施基于提醒的日期/时间的列表视图控件中的排序,并在状态栏中显示最近的提醒,这将触发。
我也被困在WM_CLOSE消息,使当用户点击"关闭"按钮,应用程序最小化,并进入到系统托盘。这是为了保持在后台运行的应用程序。另外,我还被困的最小化按钮,以便最大限度地减少也会在系统托盘中的应用程序,而不是在任务栏上。关闭该应用程序,我提供了一个在该菜单选项。
应用程序,使用户在Windows的开始,它把一个注册表项启动选项。眼下,显示在对话框的提醒,我会尝试过了一段时间,以改善用户界面。
我在这个项目中使用微软的Visual Studio 2005 Express版本。编译此应用程序在Visual Studio 6.0,我会建议启动一个空的Win32应用程序(控制台)和复制项目中的所有文件,并编译它。请在这些项目的链接器选项添加库:comctl32.lib和Psapi.lib。使用代码
在这里,我将展示一些已在代码中的代码片段。
下面的代码检查,如果应用程序已经运行。如果是的话,那么它所带来的重点窗口,否则将启动一个程序的新实例。/ / szAppName是应用程序的名称/ / / /如果程序正在运行。如果是/ /激活它退出的第二个实例
hwndPrevInstance = FindWindow(szAppName,NULL);(hwndPrevInstance){ / /如果取消它得到默认值 / / winmain.This初始化设置窗口 / /正常和积极的立场 iCmdShow = SW_SHOWNORMAL; 的ShowWindow(hwndPrevInstance,SW_SHOWNORMAL); 返回0;}/ /
窗口始终置于屏幕中心通过调用用户定义的API:BOOL CenterWindow(HWND HWND)/ / BOOL CenterWindow(HWND的HWND){ &
#160;HWND hwndParent; RECT RECT,rectP; INT宽度,高度; INT屏幕宽度,screenheight; INT X,Y; / /使窗口相对于它的桌面 hwndParent = GetDesktopWindow(); GetWindowRect(HWND,放大器; RECT); GetWindowRect(hwndParent,放大器; rectP);
160; 宽度= rect.right - rect.left; 高度= rect.bottom - rect.top; X =((rectP.right - rectP.left) - 宽)/ 2 rectP.left; Y =((rectP.bottom rectP.top) - 身高)/ 2 rectP.top; GetSystemMetrics的屏幕宽度=(SM_CXSCREEN); screenheight = GetSystemMetrics的(SM_CYSCREEN); / /确保对话框从未以外的移动
; / /屏幕 如果(x <0)X = 0; (Y <0),Y = 0; 如果(X宽GT;屏幕宽度)X =屏幕宽度 - 宽度; (Y高度GT; screenheight)Y = screenheight - 高度; 的MoveWindow(HWND,X,Y,宽度,高度,为FALSE);&
#160; 返回TRUE;}
代码检测应用程序是从哪里开始的路径,并认为,如果与Windows运行的应用程序的选项设置。这样做是为了产生一个复选标记,如果状态是在菜单。菜单是使用Win32 API,而不是一个正常的资源文件在运行时创建的。/ /代码中的WM_CREATE/ /打开过程中得到应用程序的名称hProcess = OpenProcess(PROCESS_QUERY_INFORMATION |
160; PROCESS_VM_READ,为FALSE, GetCurrentProcessId());/ /获取EXE已开始从那里目录/ /和储备100 APPNAME TCHARsszApplicationPathnName =(TCHAR *)malloc的(SIZEOF(TCHAR)*
; (GetCurrentDirectory(0,NULL)100));/ /得到了包括应用程序名称的完整路径GetModuleFileNameEx(hProcess,NULL,szApplicationPathnName,
lstrlen(szApplicationPathnName));/ /显示菜单栏HMENU = MenuDisplay(HWND);/ /检查在Windows启动应用程序启动创建菜单后/ /所以该选项,可以选中/取消CheckApplicationStartupWithWindows(HWND,HMENU);
应用程序运行两个定时器,更新应用程序中的时间/日期之一,和其他检查,如果任何提醒时间与系统时间相匹配。 CreateTrayIcon(HWND)创建一个系统托盘图标,CreateListViewBox(:HINSTANCE,HWND)创建一个列表视图控件,CreateApplicationKey()创建/打开该应用程序的注册表项/ /状态栏时间更新定时器。SetTimer的(HWND,ID_TIMER_1,950,TimerProc);/ /当前时间为每分钟注册表比较定时器SetTimer的(HWND,ID_TIMER_2,58000,TimerProc);/ /创建托盘图标CreateTrayIcon(HWND);/ /创建状态栏和存储处理hStatusBar CreateStatusBar =(HWND);/ /创建ListView控件和存储处理hListViewControl = CreateListViewBox(::HINSTANCE,HWND);/ /主要的注册表项,其中furthe数据将被保存hApplicationKey = CreateApplicationKey();/ /
提醒一旦被触发,它会自动从注册表中删除,以及该列表视图控件。
若要添加或删除提醒,双击列表视图控件或选择添加新提醒??从菜单(菜单栏和系统托盘)。将打开一个对话框,用户可以在饲料中的数据。如果是双点击在任何提醒,那么它可以被用来编辑或删除提醒。下面的代码是主要的Windows回调函数实现。如果有鼠标点击的数据,然后将数据存储在CLICKEDITEMDATA结构将存储所有信息,如日期/时间/提醒,也是一个标志,这表明如果数据有或没有。此标志将有0,表示没有数据,数据显示的是目前。这是有用的,以填补弹出对话框显示在它的所有相关数据/ /案件的WM_NOTIFY。:NMITEMACTIVATE * NMHDR = NULL; NMHDR =(NMITEMACTIVATE *)lParam的; INT itemclicked; &
#160;LRESULT我; LVHITTESTINFO pinfo; LVITEM LVITEM = {SIZEOF(LVITEM)}; (hListViewControl == NMHDR - GT; hdr.hwndFrom) { 开关(NMHDR - GT; hdr.code) {
60; 案件NM_DBLCLK:
/ /当双击项目信息来 &
#160; / / NMITEMACTIVATE结构 &
#160; / / itemclicked是从零开始的索引 &
#160; / /如果子项,然后点击我们
0; / /需要发送LVM_SUBITEMHITTEST消息
; / /鼠标coordiantes填充
0; / / LVHITTESTINFO点结构 &
#160; pinfo.pt.x = NMHDR - GT; ptAction.x;
60; pinfo.pt.y = NMHDR - GT; ptAction.y;
I = SendMessage消息(hListViewControl
; (UINT)LVM_SUBITEMHITTEST,
160; 0,(LPARAM)放大器; pinfo); &
#160; itemclicked = pinfo.iItem;
如果(-1 == itemclicked) &
#160; {
160; ClickedItemData.DatainsideListBox = 0;
0; / /没有在列表框项目
60; }
0; 其他
; {
ClickedItemData.DatainsideListBox = 1;
160; LvItem.mask = LVIF_TEXT; &
#160; LvItem.iItem = itemclicked;
LvItem.cchTextMax = SIZEOF(ClickedItemData.szDate);
0; LvItem.pszText = ClickedItemData.szDate;
160; I = SendMessage消息(hListViewControl
0; LVM_GETITEM,0,(LPARAM)放大器; LVITEM);
60; LvItem.iSubItem = 1;
0; LvItem.cchTextMax = SIZEOF(ClickedItemData.szTime);
160; LvItem.pszText = ClickedItemData.szTime;
I = SendMessage消息(hListViewControl
160; LVM_GETITEM,0,(LPARAM)放大器; LVITEM); &
#160; LvItem.iSubItem = 2;
160; LvItem.cchTextMax = SIZEOF(ClickedItemData.szReminder);
0; LvItem.pszText = ClickedItemData.szReminder;
I = SendMessage消息(hListViewControl
160; LVM_GETITEM,0, (LPARAM)放大器; LVITEM); }
; / /这里创建一个对话框
0;DialogBoxW(::HINSTANCE,MAKEINTRESOURCE(IDD_DIALOG1)
; HWND,DialogProc);
60; 返回0;
60;案件NM_CLICK:
160; / /蜂鸣声(100500);
; 返回0; 案件NM_RCLICK: / /蜂鸣声(100500);
0; 返回0; 默认值:
160; 返回DefWindowProc(HWND,消息,WPARAM,LPARAM); }
} 其他 返回DefWindowProc(HWND,消息,WPARAM,LPARAM);} / /兴趣点
我已经想出一些API可以在其他应用程序非常有用。所有这些,我会提到一个小评论。注册表操作HKEY CreateApplicationKey() - 创建一个与应用程序的名称主要的注册表项。INT AddDatatoRegistry(常量HKEY HKEY,TCHAR * szDate,TCHAR * szTime,TCHAR * szReminder) - 一个通用函数添加注册表数据与一个密钥(szDate),键值(szTime)和KeyValueData(szReminder)。INT DeleteDatafromRegistry(常量HKEY HKEY,TCHAR * szDate,TCHAR * szTime) - 用一把钥匙(szDate),键值(szTime)删除注册表数据的一般功能。被删除的keyValue(szTime)里面的数据。INT SearchRegistryString(CONST HKEY HKEY,TCHAR * szSearchTime,TCHAR * szReminderData TCHAR * szSearchDate) - 搜索子项和注册表值的名称,如果找到,则返回值的数据。UpdateListViewfromRegistry(常量,常量的HWND hListView HKEY HKEY) - 读出存储在注册表中的所有数据,然后将它添加到ListView中。INT DeleteEmptyKeysfromRegistry(常量HKEY HKEY) - 对任何空的存储键和删除注册表,使不超过一定搜索。菜单选项HMENU MenuDisplay(常量HWND的HWND) - 创建应用程序菜单,而无需使用资源。
HMENU SystemTrayMenu(常量HWND的HWND) - 创建一个弹出菜单,点击托盘图标上时。状态栏HWND CreateStatusBar(const的HWND的HWND) - 创建状态栏。无效DisplayClockDateStatusBar(常量HWND的hStatusBar) - 显示在状态栏的部分时间。ListView控件HWND CreateListViewBox(const的常量HINSTANCE HINSTANCE,HWND的HWND) - 创建ListView控件中。INT AddListViewRow(常量HWND的hControl,TCHAR * szItemText,TCHAR * szSubItemText1,TCHAR * szSubItemText2) - 一个通用函数来填充所有三个参数的列表视图。INT CALLBACK SortingCodeListViewControl(LPARAM lParam1,LPARAM lParam2,LPARAM lParamSort)??一个基于时间/日期值的列表视图中的项目进行排序的功能。一般的API,其中在代码中使用执行一些特定的任务无效DateStringtoDateComponents(TCHAR * szDate,*天短,短*月*一年短) - 日,月,年的整数值,用来填充对话框中的数据转换日期字符串。无效的DateComponentstoDateString(常量短短一天,短短的一个月常量,常量短短一年,TCHAR * szDateString) - 要转换的日期字符串,可存储在注册表中,并显示在ListView控件中的日,月,年。无效TimeStringtoTimeComponents(TCHAR * szTime,短*小时*分钟短,短* AMP) - 时间字符串转换成整数小时,分钟和AM / PM,用于填补一个对话框数据值。无效的TimeComponentstoTimeString(常量短小时,常量短期分钟,常量短期的AMP,TCHAR * szTimeString) - 转换时间字符串,可以存储在注册表中,并在ListView控件中显示小时,分钟和AM / PM。INT FillDefaultDatainDialogBox(常量的HWND hDlg) - 初始化在各种输入参数的对话框向下值下降。INT SaveDialogButton(CONST HWND hDlg,常量HKEY HKEY) - 对话框上点击"保存"按钮。INT DeleteDialogButton(CONST HWND hDlg,常量HKEY HKEY) - 对话框上的"删除"按钮。
为了尽量减少应用程序的最小化按钮被点击时的情况下WM_ACTIVATE:
; (HIWORD(wParam参数)=0安培;放大器; LOWORD(WPARAM)== WA_INACTIVE) 的ShowWindow(HWND,SW_HIDE);
; 返回0;历史
这是我的第一个版本。| kavitesh