最近遇到關於定時器的使用問題,在網上也搜尋了很多相關資料。
其中都是講了使用SetTimer 和 KillTimer
具體的介紹大家可以看看這個 串連: http://blog.csdn.net/jax_lee/article/details/6774711 裡面講的比較詳細的。
但是由於自己不是很瞭解怎樣使用,就是說在那裡添加SetTimer() 和 KillTimer() 所以嘗試也是失敗了好幾次。
經過摸索終於成功了,現在和大家分享一下,相互學習。。
我的是基於對話方塊的工程,
於是在OnInitDialog()裡面添加定時器
BOOL CMonitorProcessDlg::OnInitDialog()
{
SetTimer(1,3000,NULL); //第一個參數可以自己設定是定時器的ID,第二個參數是間隔時間(毫秒為單位的)
}
當然別忘記添加WM_TIMER訊息 OnTimer()
然後我定義了2個全域變數
int nPress = 0; //用於聯合判斷“啟動”按鈕的按下狀態
BOOL bStatic = FALSE; //用於判斷程式是否在執行,以便KillTimer()
例如按下按鈕之後,顯示“”
void CMonitorProcessDlg::OnBnClickedButtonStart()
{
MessageBox("
http://niuxiaoxu.taobao.com ");
nPress++;
bStatic = TRUE;
}
在OnTimer()函數裡面添加代碼。
void CMonitorProcessDlg::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"#include "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 CDialog{public:CAboutDlg();// 對話方塊資料enum { IDD = IDD_ABOUTBOX };protected: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()// CMonitorProcessDlg 對話方塊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_Control(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_QUERYDRAGICON()//}}AFX_MSG_MAPON_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::OnCbnSelchangeListProcessname)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 < 0xF000);CMenu* pSysMenu = GetSystemMenu(FALSE);if (pSysMenu != NULL){CString strAboutMenu;strAboutMenu.LoadString(IDS_ABOUTBOX);if (!strAboutMenu.IsEmpty()){pSysMenu->AppendMenu(MF_SEPARATOR);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;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 FALSE;}else{//do nothing}while (myFile.ReadString(oneLine)){m_ctrlProcessName.AddString(oneLine);}myFile.Close();return TRUE; // 除非將焦點設定到控制項,否則返回 TRUE}void CMonitorProcessDlg::OnSysCommand(UINT nID, LPARAM lParam){if ((nID & 0xFFF0) == IDM_ABOUTBOX){CAboutDlg dlgAbout;dlgAbout.DoModal();}else{CDialog::OnSysCommand(nID, lParam);}}// 如果向對話方塊添加最小化按鈕,則需要下面的代碼// 來繪製該表徵圖。對於使用文檔/視圖模型的 MFC 應用程式,// 這將由架構自動完成。void CMonitorProcessDlg::OnPaint(){if (IsIconic()){CPaintDC dc(this); // 用於繪製的裝置上下文SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);// 使表徵圖在工作區矩形中置中int cxIcon = GetSystemMetrics(SM_CXICON);int 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_cast<HCURSOR>(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 ::TerminateProcess( hProcessHandle, 4 );}////////////////////////////啟動int nPress = 0; //用於聯合判斷“啟動”按鈕的按下狀態BOOL bStatic = FALSE; //用於判斷程式是否在執行,以便KillTimervoid CMonitorProcessDlg::OnBnClickedButtonStart(){// TODO: 在此添加控制項通知處理常式代碼//讀取命令列參數LPTSTR lpstr=AfxGetApp()->m_lpCmdLine;this->ShowWindow(SW_HIDE);//讀取路徑以及檔案名稱CString strCmdLine;strCmdLine = 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);iStartIndex=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 (strlen(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 , "", 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 (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) //表徵圖ID 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_LEFTALIGN,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=(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_ADD,&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=LoadIcon(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_strPathName);}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(i>0) { i--; ShowWindow(SW_HIDE); } else {CDialog::OnNcPaint(); }}void CMonitorProcessDlg::OnTimer(UINT_PTR nIDEvent){// TODO: 在此添加訊息處理常式代碼和/或調用預設值if (nIDEvent ==1 && nPress ==1){OnBnClickedButtonStart();nPress --;}if (bStatic == TRUE){KillTimer(1);}CDialog::OnTimer(nIDEvent);}