关于网友提出的“ 已知一个控制台的进程ID,如何取得其窗体句柄”问题疑问,本网通过在网上对“ 已知一个控制台的进程ID,如何取得其窗体句柄”有关的相关答案进行了整理,供用户进行参考,详细问题解答如下:
问题: 已知一个控制台的进程ID,如何取得其窗体句柄描述:
我用
CreateProcess("c:\\winnt\\system32\\cmd.exe ","/c ping 202.103.29.213 -t"
,NULL,NULL,TRUE,NULL,NULL,NULL,&si,&pi)
启动控制台进程,一段时间后我想关闭这个进程如何实现。
TerminateProcess(ProcessInfo.dwProcessId,0);好像不起作用。请各位指点一二。
解决方案1:
没那么复杂,知道进程名不就知道PID了么?直接杀就可以了
const char DESTPROC[19] = "cmd.exe";
DWORD pid = ProcessToPID(DESTPROC);
知道PID后,杀进程你该会吧?
DWORD ProcessToPID(const char *InputProcessName)
{
DWORD aProcesses[1024], cbNeeded, cProcesses;
unsigned int i;
HANDLE hProcess = NULL;
HMODULE hMod = NULL;
char szProcessName[MAX_PATH] = "UnknownProcess";
AddPrivilege(SE_DEBUG_NAME);
// 计算目前有多少进程, aProcesses[]用来存放有效的进程PIDs
if ( !EnumProcesses( aProcesses, sizeof(aProcesses), &cbNeeded ) )
{
return 0;
}
cProcesses = cbNeeded / sizeof(DWORD);
// 按有效的PID遍历所有的进程
for ( i = 0; i < cProcesses; i++ )
{
// 打开特定PID的进程
hProcess = OpenProcess( PROCESS_QUERY_INFORMATION |
PROCESS_VM_READ,
FALSE, aProcesses[i]);
// 取得特定PID的进程名
if ( hProcess )
{
if ( EnumProcessModules( hProcess, &hMod, sizeof(hMod), &cbNeeded) )
{
GetModuleBaseName( hProcess, hMod,
szProcessName, sizeof(szProcessName) );
//将取得的进程名与输入的进程名比较,如相同则返回进程PID
if(!stricmp(szProcessName, InputProcessName))
{
CloseHandle( hProcess );
return aProcesses[i];
}
}
}//end of if ( hProcess )
}//end of for
//没有找到相应的进程名,返回0
CloseHandle( hProcess );
return 0;
}
CreateProcess的最后一个参数pi返回新建进程的句柄,而且具有Terminate权限,你可以通过这个句柄中止新建的进程。
解决方案3: TerminateProcess的第一个参数应该是进程的句柄, 不应该是id.
要结束该进程, 先要OpenProcess, 记得带参数PROCESS_TERMINATE
HANDLE hProc = OpenProcess(
PROCESS_TERMINATE,
FALSE,
ProcessInfo.dwProcessId
);
TerminateProcess( hProc, 0 );
CloseHandle( hProc );
用枚举窗口可以,不过办法比较笨!
解决方案6:要取得它的window handle,可以先记录CreateProcess返回的process id,然后EnumWindows, GetWindowThreadProcessId 找到属于这个console进程的HWND
解决方案7: 使用findwindow()
类名为ConsoleWindowClass
或者窗口标题是控制台程序的完整路径名