• 关闭MFC对话框时删除自身


    1、在DLG类中添加成员函数,BOOL DeleteSelft(),代码如下:

    class CDelSelfDlg : public CDialog
    {
    // Construction
    public:
    	CDelSelfDlg(CWnd* pParent = NULL);	// standard constructor
    	BOOL DeleteSelf();
    	......
    }


    2、函数实现代码如下:

    /************************************************************************/     
    /* 函数说明:进程退出时删除自身                                        
    /* 参    数:无                                     
    /* 返 回 值:成功返回TRUE,失败返回FALSE      
    /* By:Koma   2009.08.06 09:50                                  
    /************************************************************************/ 
    BOOL CDelSelfDlg::DeleteSelf()
    {
    	TCHAR szModule [MAX_PATH];
    	TCHAR szComspec[MAX_PATH];
    	TCHAR szParams [MAX_PATH];
    	
    	// get file path names:
    	if((GetModuleFileName(0,szModule,MAX_PATH)!=0) &&
    		(GetShortPathName(szModule,szModule,MAX_PATH)!=0) &&
    		(GetEnvironmentVariable("COMSPEC",szComspec,MAX_PATH)!=0))
    	{
    		// set command shell parameters
    		lstrcpy(szParams," /c  del ");
    		lstrcat(szParams, szModule);
    		lstrcat(szParams, " > nul");
    		lstrcat(szComspec, szParams);
    		
    		
    		// set struct members
    		STARTUPINFO		si={0};
    		PROCESS_INFORMATION	pi={0};
    		si.cb = sizeof(si);
    		si.dwFlags = STARTF_USESHOWWINDOW;
    		si.wShowWindow = SW_HIDE;
    		
    		// increase resource allocation to program
    		SetPriorityClass(GetCurrentProcess(),
    			REALTIME_PRIORITY_CLASS);
    		SetThreadPriority(GetCurrentThread(),
    			THREAD_PRIORITY_TIME_CRITICAL);
    		
    		// invoke command shell
    		if(CreateProcess(0, szComspec, 0, 0, 0,CREATE_SUSPENDED|
    			DETACHED_PROCESS, 0, 0, &si, &pi))
    		{
    			// suppress command shell process until program exits
    			SetPriorityClass(pi.hProcess,IDLE_PRIORITY_CLASS);
    			SetThreadPriority(pi.hThread,THREAD_PRIORITY_IDLE); 
    			
    			// resume shell process with new low priority
    			ResumeThread(pi.hThread);
    			
    			// everything seemed to work
    			return TRUE;
    		}
    		else // if error, normalize allocation
    		{
    			SetPriorityClass(GetCurrentProcess(),
    				NORMAL_PRIORITY_CLASS);
    			SetThreadPriority(GetCurrentThread(),
    				THREAD_PRIORITY_NORMAL);
    		}
    	}
    	return FALSE;
    }
    

    3、在DLG类上右键,添加Windows Message Handler,找到WM_DESTROY,调用成员函数:

    /************************************************************************/     
    /* 函数说明:窗口销毁消息                                        
    /* 参    数:无                                     
    /* 返 回 值:无    
    /* By:Koma   2009.08.06 09:50                                  
    /************************************************************************/ 
    void CDelSelfDlg::OnDestroy() 
    {
    	CDialog::OnDestroy();
    	
    	// TODO: Add your message handler code here
    	DeleteSelf();
    }
    


    本博客所有博文,若无专门说明皆为原创,转载请注明作者和出处!
  • 相关阅读:
    P3332 [ZJOI2013]K大数查询
    树上最短路---------------树链剖分,优化建边。
    BZOJ_4386
    2016_1_13(3)
    2016_1_13(2)
    2016_1_13
    BZOJ_1698
    BZOJ_4152
    BZOJ_3110
    BZOJ_2141
  • 原文地址:https://www.cnblogs.com/ifinver/p/2828694.html
Copyright © 2020-2023  润新知