通过MFC关闭一个CMD程序

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了通过MFC关闭一个CMD程序相关的知识,希望对你有一定的参考价值。

通过MFC关闭一个CMD程序,怎么写?

直接结束CMD.exe进程就行了

BOOL KillProcess ( HWND hWnd, LPTSTR lpAppName )

TCHAR szApp [MAX_PATH] = _T("");
_tcscpy ( szApp, lpAppName );

PROCESSENTRY32 pe32;

pe32.dwSize = sizeof( pe32 );

HANDLE hProcessSnap = ::CreateToolhelp32Snapshot( TH32CS_SNAPPROCESS, 0 );

if ( hProcessSnap == INVALID_HANDLE_VALUE )

MessageBox( hWnd, L"Can't Create Snapshot", L"System Info.", NULL );
return FALSE;


BOOL bNext = ::Process32First( hProcessSnap, &pe32 );

while( bNext )

if( _tcscmp ( CharLower ( pe32.szExeFile ), CharLower ( szApp )) == 0 )

HANDLE hProcess = OpenProcess( PROCESS_ALL_ACCESS, FALSE, pe32.th32ProcessID );
TerminateProcess( hProcess, 0 );


bNext = ::Process32Next( hProcessSnap,&pe32 );


CloseHandle( hProcessSnap );

return TRUE;
参考技术A DWORD dwProcID,ID;
HANDLE hProcess;
BOOL CALLBACK EnumWindowsProc_1(HWND hwnd,LPARAM lparam)

char lpWinTitle[256];
::GetWindowText(hwnd,lpWinTitle,256-1);
CString m_strTitle;

m_strTitle.Format("%s",lpWinTitle);
if(m_strTitle.Find("cmd.exe")!=-1)


AfxMessageBox("这是一个cmd窗口!"+m_strTitle) ;
ID = GetWindowThreadProcessId(hwnd, &dwProcID);
hProcess = OpenProcess(PROCESS_ALL_ACCESS,false,dwProcID);//我在断点调试的时候总是会发现hProcess的值是0,但是像dwProcID,ID等都获取到了值,为什么在此却获取不到OpenProcess返回的值呢???????

TerminateProcess(hProcess, 0);
return false;
//

MFC 应用程序在启动时关闭

【中文标题】MFC 应用程序在启动时关闭【英文标题】:MFC App closes on startup 【发布时间】:2014-06-20 09:39:21 【问题描述】:

尝试运行一个简单的 MFC 应用程序但由于程序终止而关闭,假设我需要在单独的线程中运行该对话框但不知道如何。

这是目前为止的代码:

CWinApp theApp;

using namespace std;

int main(int argc, TCHAR* argv[], TCHAR* envp[])

    int nRetCode = 0;

    HMODULE hModule = ::GetModuleHandle(NULL);

    theApp.InitApplication();
    theApp.InitInstance();
    theApp.Run();

    AfxWinTerm();

    if (hModule != NULL)
    
        // initialize MFC and print and error on failure
        if (!AfxWinInit(hModule, NULL, ::GetCommandLine(), 0))
        
            // TODO: change error code to suit your needs
            _tprintf(_T("Fatal Error: MFC initialization failed\n"));
            nRetCode = 1;

        
        else
        
            MyDialog *mdlg = new MyDialog();
            mdlg->Create( IDD_MDLG, theApp.m_pMainWnd);
            mdlg->ShowWindow( true );

        
    
    else
    
        // TODO: change error code to suit your needs
        _tprintf(_T("Fatal Error: GetModuleHandle failed\n"));
        nRetCode = 1;
    

    return nRetCode;

我必须做一些简单的事情来防止程序终止,只是不确定如何?

【问题讨论】:

【参考方案1】:

而不是调用:

mdlg->ShowWindow( true );

你应该这样做:

mdlg->DoModal();

另外,我认为你不需要Create。如果你想继续使用无模式对话框,那么你应该在从 main 返回之前创建消息循环 - 就像这里 http://en.wikipedia.org/wiki/Message_loop_in_Microsoft_Windows

【讨论】:

正在查看,但我的类(从 CDialog 继承)没有成员“DoModel”? 如果是 MFC CDialog 那么它肯定有 DoModal(通过继承):msdn.microsoft.com/pl-pl/library/619z63f5.aspx 是的,我是个白痴,我得到一个调试断言失败:// 不能在已经构造为无模式 ASSERT(m_hWnd == NULL)的对话框上调用 DoModal; 摆脱了创建,但消息泵断言失败:TRACE(traceAppMsg, 0, "Error: CWinThread::PumpMessage called when not allowed.\n");断言(错误); 终于搞定了;使用你的***链接并在执行 Create() 和 ShowWindow() 后调用 WinMain;【参考方案2】:

据我所知,您创建了一个 Win32 控制台应用程序并尝试向其添加 GUI?只有当你真的需要控制台时,你才应该这样做。如果没有,那么最好创建一个新项目,选择 MFC 应用程序模板并选择基于对话框的应用程序。该向导将创建您需要的所有内容。

顺便说一句,你的

MyDialog *mdlg = new MyDialog();
mdlg->Create( IDD_MDLG, theApp.m_pMainWnd);
mdlg->ShowWindow( true );

最好是:

MyDialog mdlg;
mdlg.DoModal();

在你的情况下不需要new,所以只需在堆栈上分配对象。 DoModal 做你想做的事。

在我的支持 MFC 的 Win32 控制台应用程序中,我能够显示一个对话框。但在我的向导生成的代码中,这些行不存在,所以也许你应该删除它们:

theApp.InitApplication();
theApp.InitInstance();
theApp.Run();

AfxWinTerm();

【讨论】:

是的,这就是我想要的,知道为什么会出现这种情况:TRACE(traceAppMsg, 0, "Error: CWinThread::PumpMessage call when not allowed.\n");断言(错误); ? @user3047190 该消息什么时候来?您是重新创建项目还是这仍然是控制台应用程序?什么时候出现错误? 谢谢,使用已接受答案中的 wiki 链接解决了这个问题,我知道问题与消息抽取有关,因此 wiki 链接允许我创建一个消息循环以在对话框按钮之间传递消息和程序 - 并通过扩展保持程序打开 @user3047190 我更新了我的答案。无需创建消息循环!

以上是关于通过MFC关闭一个CMD程序的主要内容,如果未能解决你的问题,请参考以下文章

MFC编程中,程序运行,若关闭对话框 ,程序会崩溃.

如何通过代码(在cmd中)打开屏幕保护程序(Windows 7)? [关闭]

MFC 中标题栏上的关闭按钮

有没有办法我们可以通过Windows中的CMD将文件上传到谷歌驱动器文件夹[关闭]

如何用CMD命令结束一个进程和打开一个程序?

为啥我的 MFC 应用程序无法完全退出?