1、MFC 定时器的使用MFC 定时器的使用点击连接(按住Ctrl点击) 最近遇到关于定时器的使用问题,在网上也搜索了很多相关资料。其中都是讲了使用SetTimer 和 KillTimer具体的介绍大家可以看看这个连接:里面讲的比较详细的。 但是由于自己不是很了解怎样使用,就是说在那里添加SetTimer() 和 KillTimer() 所以尝试也是失败了好几次。经过摸索终于成功了,现在和大家分享一下,相互学习。我的是基于对话框的工程,于是在OnInitDialog()里面添加定时器BOOL CMonitorProcessDlg:OnInitDialog() SetTimer(1,3000,NUL
2、L); /第一个参数可以自己设置是定时器的ID,第二个参数是间隔时间(毫秒为单位的)当然别忘记添加WM_TIMER消息 OnTimer()然后我定义了2个全局变量int nPress = 0; /用于联合判断“启动”按钮的按下状态BOOL bStatic = FALSE; /用于判断程序是否在执行,以便KillTimer()例如按下按钮之后,显示“”void CMonitorProcessDlg:OnBnClickedButtonStart() MessageBox( );nPress+; bStatic = TRUE;在OnTimer()函数里面添加代码。void CMonitorProce
3、ssDlg:OnTimer(UINT_PTR nIDEvent)/ TODO: 在此添加消息处理程序代码和/或调用默认值if (nIDEvent =1 & nPress =1)OnBnClickedButtonStart();nPress -;if (bStatic = TRUE)KillTimer(1);CDialog:OnTimer(nIDEvent);上面只是一个简单的演示,希望对大家有帮助吧。下面的是我工程里面的代码:(是用来监测其他程序的,如果其他程序没有执行则重启该程序。)/ MonitorProcessDlg.cpp : 实现文件/#include stdafx.h#includ
4、e MonitorProcess.h#include MonitorProcessDlg.h#include Psapi.h#pragma comment(lib,psapi.lib)#ifdef _DEBUG#define new DEBUG_NEW#endif/注册消息WM_SHOWTASK#define WM_SHOWTASK (WM_USER +1)/ 用于应用程序“关于”菜单项的 CAboutDlg 对话框class CAboutDlg : public CDialogpublic: CAboutDlg();/ 对话框数据 enum IDD = IDD_ABOUTBOX ; prot
5、ected: virtual void DoDataExchange(CDataExchange* pDX); / DDX/DDV 支持/ 实现protected: DECLARE_MESSAGE_MAP();CAboutDlg:CAboutDlg() : CDialog(CAboutDlg:IDD)void CAboutDlg:DoDataExchange(CDataExchange* pDX) CDialog:DoDataExchange(pDX);BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)END_MESSAGE_MAP()/ CMonitorProcess
6、Dlg 对话框CMonitorProcessDlg:CMonitorProcessDlg(CWnd* pParent /*=NULL*/) : CDialog(CMonitorProcessDlg:IDD, pParent) , m_strPathName(_T() , m_strProcessName(_T() m_hIcon = AfxGetApp()-LoadIcon(IDR_MAINFRAME);void CMonitorProcessDlg:DoDataExchange(CDataExchange* pDX) CDialog:DoDataExchange(pDX); DDX_Cont
7、rol(pDX, IDC_LIST_PATHNAME, m_ctrlPathName); DDX_CBString(pDX, IDC_LIST_PATHNAME, m_strPathName); DDX_Control(pDX, IDC_LIST_PROCESSNAME, m_ctrlProcessName); DDX_CBString(pDX, IDC_LIST_PROCESSNAME, m_strProcessName);BEGIN_MESSAGE_MAP(CMonitorProcessDlg, CDialog) ON_WM_SYSCOMMAND() ON_WM_PAINT() ON_WM
8、_QUERYDRAGICON() /AFX_MSG_MAP ON_BN_CLICKED(ID_BUTTON_START, &CMonitorProcessDlg:OnBnClickedButtonStart) ON_WM_HOTKEY() ON_MESSAGE(WM_SHOWTASK,OnShowTask) ON_CBN_SELCHANGE(IDC_LIST_PATHNAME, &CMonitorProcessDlg:OnCbnSelchangeListPathname) ON_CBN_SELCHANGE(IDC_LIST_PROCESSNAME, &CMonitorProcessDlg:On
9、CbnSelchangeListProcessname) ON_WM_NCPAINT() ON_WM_TIMER()END_MESSAGE_MAP()/ CMonitorProcessDlg 消息处理程序BOOL CMonitorProcessDlg:OnInitDialog() CDialog:OnInitDialog(); / 将“关于.”菜单项添加到系统菜单中。 / IDM_ABOUTBOX 必须在系统命令范围内。 ASSERT(IDM_ABOUTBOX & 0xFFF0) = IDM_ABOUTBOX); ASSERT(IDM_ABOUTBOX AppendMenu(MF_SEPARA
10、TOR); pSysMenu-AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu); / 设置此对话框的图标。当应用程序主窗口不是对话框时,框架将自动 / 执行此操作 SetIcon(m_hIcon, TRUE); / 设置大图标 SetIcon(m_hIcon, FALSE); / 设置小图标 / TODO: 在此添加额外的初始化代码 :RegisterHotKey(m_hWnd,918,MOD_CONTROL,S); /添加定时器 SetTimer(1,3000,NULL); CStdioFile myFile; CString oneLine
11、; if(!myFile.Open(path.txt),CFile:modeRead | CFile:typeText) AfxMessageBox(_T(打开文件错误!); return FALSE; else /do nothing while (myFile.ReadString(oneLine) m_ctrlPathName.AddString(oneLine); myFile.Close(); if(!myFile.Open(process.txt),CFile:modeRead | CFile:typeText) AfxMessageBox(_T(打开文件错误!); return
12、FALSE; else /do nothing while (myFile.ReadString(oneLine) m_ctrlProcessName.AddString(oneLine); myFile.Close(); return TRUE; / 除非将焦点设置到控件,否则返回 TRUEvoid CMonitorProcessDlg:OnSysCommand(UINT nID, LPARAM lParam) if (nID & 0xFFF0) = IDM_ABOUTBOX) CAboutDlg dlgAbout; dlgAbout.DoModal(); else CDialog:OnSy
13、sCommand(nID, lParam); / 如果向对话框添加最小化按钮,则需要下面的代码/ 来绘制该图标。对于使用文档/视图模型的 MFC 应用程序,/ 这将由框架自动完成。void CMonitorProcessDlg:OnPaint() if (IsIconic() CPaintDC dc(this); / 用于绘制的设备上下文 SendMessage(WM_ICONERASEBKGND, reinterpret_cast(dc.GetSafeHdc(), 0); / 使图标在工作区矩形中居中 int cxIcon = GetSystemMetrics(SM_CXICON); int
14、 cyIcon = GetSystemMetrics(SM_CYICON); CRect rect; GetClientRect(&rect); int x = (rect.Width() - cxIcon + 1) / 2; int y = (rect.Height() - cyIcon + 1) / 2; / 绘制图标 dc.DrawIcon(x, y, m_hIcon); else CDialog:OnPaint(); /当用户拖动最小化窗口时系统调用此函数取得光标/显示。HCURSOR CMonitorProcessDlg:OnQueryDragIcon() return static
15、_cast(m_hIcon);/int KillProcess( LPCSTR pszWindowTitle) HANDLE hProcessHandle; ULONG nProcessID; HWND TheWindow; TheWindow = :FindWindow( NULL, pszWindowTitle ); :GetWindowThreadProcessId( TheWindow, &nProcessID ); hProcessHandle =:OpenProcess( PROCESS_TERMINATE,FALSE, nProcessID ); return :Terminat
16、eProcess( hProcessHandle, 4 );/启动int nPress = 0; /用于联合判断“启动”按钮的按下状态BOOL bStatic = FALSE; /用于判断程序是否在执行,以便KillTimervoid CMonitorProcessDlg:OnBnClickedButtonStart() / TODO: 在此添加控件通知处理程序代码 /读取命令行参数 LPTSTR lpstr=AfxGetApp()-m_lpCmdLine; this-ShowWindow(SW_HIDE); /读取路径以及文件名 CString strCmdLine; strCmdLine
17、= m_strPathName; /读取程序名 CString processName; processName = m_strProcessName; CString Warning( 正在运行中! 或者 输入有误!); int iStartIndex=1; int iEndIndex=0; CString cCurrentDir=; CString strTempName=; iEndIndex=strCmdLine.Find(-,iStartIndex); cCurrentDir=strCmdLine.Mid(iStartIndex,iEndIndex-iStartIndex-1); i
18、StartIndex=iEndIndex+1; strTempName=strCmdLine.Mid(iStartIndex,strCmdLine.GetLength()-iStartIndex); /BOOL Temp = IsAbort(char*)(LPCTSTR)strTempName); LPCSTR pName(MonitorProcess); if (strlen(strCmdLine) = 0 & strlen(processName) = 0) AfxMessageBox(未输入有效信息!); KillProcess(pName); return; else if (strl
19、en(strCmdLine) = 0 ) AfxMessageBox(未输入有效的路径名!); KillProcess(pName); return; else if (strlen(processName) = 0) AfxMessageBox(未输入程序名!); KillProcess(pName); return; else /do nothing CWnd *pWnd = CWnd:FindWindow(NULL,(LPCSTR)processName); if (pWnd = NULL) /如果中断 重新启动 ShellExecute(NULL, open, strTempName
20、, , cCurrentDir, SW_SHOWNORMAL); /KillProcess(pName); else Warning.Insert(0,processName); AfxMessageBox(Warning); bStatic = TRUE; /KillProcess(pName); nPress+; return;/快捷键int i = 0;/用于联合判断热键的按下状态void CMonitorProcessDlg:OnHotKey(UINT nHotKeyId, UINT nKey1, UINT nKey2) / TODO: 在此添加消息处理程序代码和/或调用默认值 if
21、(i=0 & nHotKeyId = 918) i+; this-ShowWindow(SW_SHOW);/显示主窗口 DeleteTray(); else if (i=1 & nHotKeyId = 918) i-; ToTray(); /OnShowTask(IDR_MAINFRAME,lParam); CDialog:OnHotKey(nHotKeyId, nKey1, nKey2);/自定义消息LRESULT CMonitorProcessDlg:OnShowTask(WPARAM wParam,LPARAM lParam) if(wParam!=IDR_MAINFRAME) /图标I
22、D return 1; switch(lParam) case WM_RBUTTONUP:/右键起来时弹出快捷菜单,这里只有一个“退出” LPPOINT lpoint=new tagPOINT; :GetCursorPos(lpoint);/得到鼠标位置 CMenu menu; menu.CreatePopupMenu();/声明一个弹出式菜单 /增加菜单项“退出”,点击则发送消息WM_DESTROY给主窗口将程序结束。 menu.AppendMenu(MF_STRING,WM_DESTROY,退 出); /确定弹出式菜单的位置 menu.TrackPopupMenu(TPM_LEFTALIG
23、N,lpoint-x,lpoint-y,this); /资源回收 HMENU hmenu=menu.Detach(); menu.DestroyMenu(); delete lpoint; DeleteTray(); break; case WM_LBUTTONDBLCLK:/双击左键的处理 this-ShowWindow(SW_SHOW);/显示主窗口 DeleteTray(); break; default: break; return 0;/托盘绘制图标void CMonitorProcessDlg:ToTray(void) NOTIFYICONDATA nid; nid.cbSize=
24、(DWORD)sizeof(NOTIFYICONDATA); nid.hWnd=this- m_hWnd; nid.uID=IDR_MAINFRAME; nid.uFlags=NIF_ICON|NIF_MESSAGE|NIF_TIP ; nid.uCallbackMessage=WM_SHOWTASK;/自定义的消息名称 nid.hIcon=LoadIcon(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDR_MAINFRAME); strcpy(nid.szTip, MonitorProcess);/信息提示条 Shell_NotifyIcon(NIM_AD
25、D,&nid);/在托盘区添加图标 ShowWindow(SW_HIDE);/隐藏主窗口 /删除托盘图标void CMonitorProcessDlg:DeleteTray(void) NOTIFYICONDATA nid; nid.cbSize=(DWORD)sizeof(NOTIFYICONDATA); nid.hWnd=this-m_hWnd; nid.uID=IDR_MAINFRAME; nid.uFlags=NIF_ICON|NIF_MESSAGE|NIF_TIP ; nid.uCallbackMessage=WM_SHOWTASK;/自定义的消息名称 nid.hIcon=LoadI
26、con(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDR_MAINFRAME); strcpy(nid.szTip,MonitorProcess); /信息提示条 Shell_NotifyIcon(NIM_DELETE,&nid); /在托盘区删除图标void CMonitorProcessDlg:OnCbnSelchangeListPathname() / TODO: 在此添加控件通知处理程序代码 int j=0; j = m_ctrlPathName.GetCurSel(); m_ctrlPathName.GetLBText(j,m_strPathNam
27、e);void CMonitorProcessDlg:OnCbnSelchangeListProcessname() / TODO: 在此添加控件通知处理程序代码 int j=0; j = m_ctrlProcessName.GetCurSel(); m_ctrlProcessName.GetLBText(j,m_strProcessName);void CMonitorProcessDlg:OnNcPaint() / TODO: 在此处添加消息处理程序代码 / 不为绘图消息调用 CDialog:OnNcPaint() static int i = 2; if(i0) i-; ShowWindow(SW_HIDE); else CDialog:OnNcPaint(); void CMonitorProcessDlg:OnTimer(UINT_PTR nIDEvent)
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1