返回首页





简介
这个项目的目的是制定一个提醒的应用程序,它可以存储多个提醒和将显示一个消息框,由用户指定的时间。应用程序可以启动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 SaveDialogBu​​tton(CONST HWND hDlg,常量HKEY HKEY) - 对话框上点击"保存"按钮。INT DeleteDialogBu​​tton(CONST HWND hDlg,常量HKEY HKEY) - 对话框上的"删除"按钮。
为了尽量减少应用程序的最小化按钮被点击时的情况下WM_ACTIVATE:  ; (HIWORD(wParam参数)=0安培;放大器; LOWORD(WPARAM)== WA_INACTIVE) 的ShowWindow(HWND,SW_HIDE);   ; 返回0;历史
这是我的第一个版本。| kavitesh

回答

评论会员:游客 时间:2011/12/07
嗨,我需要一个简单的提示到我的网站的访问者可以下载的应用程序。我想他们,我设置的日期和时间开辟了一个他们的桌面上的赛普尔flash动画,他们可以点击,它会带他们到我的网站下载应用程序。你能提醒应用程序进行调整,这样做呢?如果是你会能够帮助吨。感谢乔imgsrc=http://www.orcode.com/upimg/2011_12_07_01_57_15_4.gif
kavitesh
评论会员:游客 时间:2011/12/07
可以很好地用在我的代码提供了实现此功能的API。本身的代码将有所减少,因为你想它有GUI和非常少,希望它在后台运行。尽量打开Flash文件,我以为你会船除了应用文件。或简单的任务将是使应用程序中打开网页浏览器和自动加载所需的页面。如果你要自动运行的网站和时间,将需要更多的信息应用程序。现在,这可以很容易地放进一个小的配置文件,可以沿我的应用程序存储在注册表的提醒信息,并删除它时,提醒废去。但对于你,我想你想要的应用程序能够自动了解触发时间。这是可以做到的配置文件或使用命令行参数,用户类型当他/她运行的应用程序
。ngclinh
评论会员:游客 时间:2011/12/07
,因为我是一个C初学者,所以我不会有任何意见,但我发现你的应用程序与我是非常好的。非常感谢您为您的文章。我会写一个小的应用程序,它会从互联网上获取的数据(股票指数的数据)和一张小桌子靠近到系统托盘上显示它们。这些数据将被更新后金额第二。我想,但它似乎是与我很难。因此,如果您有任何建议,它会受到欢迎。再次感谢您!
kavitesh
评论会员:游客 时间:2011/12/07
您好,已经很晚,我回答你的应用程序。但是,因为你想干什么,这个时候你已经完成的应用程序。我建议几件事情:-1。你可以有一个在系统托盘的小图标,在那里你可以保持把它在前台或后台应用程序。我在放置代码,这可能是您感兴趣的。2。既然你获得来自互联网的数据,我假定您正在使用Web服务或使用MFC。的Win32位的东西复杂的访问控制,如InternetExplorer中的ActiveX控制。3。显示系统托盘附近的信息。尝试寻找烤面包机窗口SDK。如果你有MSNMessenger的使用,你会看到弹出小窗口右下角指示的人签署或签署。没有分心用户可以显示这样的信息。该代码是在CodeProject上也为你提供帮助。4。如果您决定在CodeProject上后,做的PM我,因为我想看到应用程序。期待您的应用程序。的问候,Kavitesh辛格
。ReLaX_VB
评论会员:游客 时间:2011/12/07
感谢分享本守则ANDEPLZ让我知道,如果代码是uptaded
kavitesh
评论会员:游客 时间:2011/12/07
喜我想提一提的代码是功能齐全的..请让我知道我可以改善的GUI其他地区..也许一个新的想法,实施不同的方式或东西..
Adamw
评论会员:游客 时间:2011/12/07
好主意!下一个版本的几点建议:1)调整窗口大小时,调整的ListBox2)选项隐藏系统托盘中的图标3)选项来禁用声音警报4)选项来改变声音发挥的警报5)添加版本信息亚当
kavitesh
评论会员:游客 时间:2011/12/07
感谢您的宝贵意见我会尽量执行所有即将..