通过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程序的主要内容,如果未能解决你的问题,请参考以下文章
如何通过代码(在cmd中)打开屏幕保护程序(Windows 7)? [关闭]