mfc中如何获得进程中所有进程句柄名

toma2008 2014-11-26 12:02:08
其实我是想关闭一个外部运行的exe程序,我又不知道这个程序的句柄,所有想先找出这个句柄,再关闭。
...全文
388 5 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2014-11-26
  • 打赏
  • 举报
回复
GetWindowThreadProcessId The GetWindowThreadProcessId function retrieves the identifier of the thread that created the specified window and, optionally, the identifier of the process that created the window. DWORD GetWindowThreadProcessId( HWND hWnd, // handle to window LPDWORD lpdwProcessId // address of variable for process identifier ); Parameters hWnd Handle to the window. lpdwProcessId Pointer to a 32-bit value that receives the process identifier. If this parameter is not NULL, GetWindowThreadProcessId copies the identifier of the process to the 32-bit value; otherwise, it does not. Return Values The return value is the identifier of the thread that created the window. QuickInfo Windows NT: Requires version 3.1 or later. Windows: Requires Windows 95 or later. Windows CE: Requires version 1.0 or later. Header: Declared in winuser.h. Import Library: Use user32.lib. See Also Windows Overview, Window Functions
赵4老师 2014-11-26
  • 打赏
  • 举报
回复
引用 3 楼 toma2008 的回复:
我换一种问法,如何获得;目标窗口标题
GetWindowText The GetWindowText function copies the text of the specified window's title bar (if it has one) into a buffer. If the specified window is a control, the text of the control is copied. However, GetWindowText cannot retrieve the text of a control in another application. int GetWindowText( HWND hWnd, // handle to window or control with text LPTSTR lpString, // address of buffer for text int nMaxCount // maximum number of characters to copy ); Parameters hWnd Handle to the window or control containing the text. lpString Pointer to the buffer that will receive the text. nMaxCount Specifies the maximum number of characters to copy to the buffer, including the NULL character. If the text exceeds this limit, it is truncated. Return Values If the function succeeds, the return value is the length, in characters, of the copied string, not including the terminating null character. If the window has no title bar or text, if the title bar is empty, or if the window or control handle is invalid, the return value is zero. To get extended error information, callGetLastError. This function cannot retrieve the text of an edit control in another application. Remarks If the target window is owned by the current process, GetWindowText causes a WM_GETTEXT message to be sent to the specified window or control. If the target window is owned by another process and has a caption, GetWindowText retrieves the window caption text. If the window does not have a caption, the return value is a null string. QuickInfo Windows NT: Requires version 3.1 or later. Windows: Requires Windows 95 or later. Windows CE: Requires version 1.0 or later. Header: Declared in winuser.h. Import Library: Use user32.lib. Unicode: Implemented as Unicode and ANSI versions on Windows NT. See Also Windows Overview, Window Functions, GetWindowTextLength, SetWindowText, WM_GETTEXT
toma2008 2014-11-26
  • 打赏
  • 举报
回复
我换一种问法,如何获得;目标窗口标题
lis2012 2014-11-26
  • 打赏
  • 举报
回复
HWND hWnd; DWORD dwProcessID = 0;//获取进程ID hWnd =::FindWindow(NULL, "目标窗口标题 "); if(hWnd) { ::GetWindowThreadProcessId(hWnd,&dwProcessID);//获取进程ID }
笨笨仔 2014-11-26
  • 打赏
  • 举报
回复
函数:

// 取进程
BOOL CHelpCenterApp::GetProcessID(CString ProcessName, DWORD &hProcID, DWORD &ParentID)
{
	int con=0;
	CString str;
	PROCESSENTRY32 pe32;
	pe32.dwSize=sizeof(pe32);
	// 获得系统内所有进程快照
	HANDLE hProcessSnap=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
	if(hProcessSnap==INVALID_HANDLE_VALUE)
	{
		// 出错
		return FALSE;
	}
	// 枚举列表中的第一个进程
	BOOL bProcess=Process32First(hProcessSnap,&pe32);
	while(bProcess)
	{
		str=pe32.szExeFile;
		// 比较进程名,找到要找的进程名
		if(ProcessName.CompareNoCase(str)==0)
		{
			con++;								// 进程数加1
		}
		// 继续查找
		bProcess=Process32Next(hProcessSnap,&pe32);
	}
	CloseHandle(hProcessSnap);
	if(con>1)
		return TRUE;							// 进程已经启动
	else
		return FALSE;							// 进程没有启动
}
应用 例如:

	name=_T("HelpCenter.exe");							// 获取本进程文件名
	// 以查进程方式检查程序是否已经运行
	BOOL bJudge=false;
	DWORD procID;										// 本进程ID
	DWORD parentID;										// 父进程ID
	bJudge=GetProcessID(name,procID,parentID);
	if(bJudge)
	{
		// 文件已经打开
		AfxMessageBox(_T("程序已经运行!"));
		exit(0);
	}
VC获得进程ID获得主线程ID获得窗口句柄获得主窗口获得进程 1.窗口类 窗口句柄 窗口标题 窗口句柄 HWND FindWindow( LPCTSTR lpClassName, //窗口类 可用 VC或者VS自带的Spy++查看 LPCTSTR lpWindowName //窗口标题 ); 举例: 以 记事本为例, 记事本 窗口类 为:NotePad, 窗口标题 视按具体情况而定,假设为"新建 文本文档.txt - 记事本" 窗口类 窗口句柄 TCHAR lpClassName[]=TEXT("NotePad"); HWND hWnd=::FindWindow(lpClassName,NULL); if(hWnd && IsWindow(hWnd)) ::ShowWindow(hWnd,SW_HIDE); 窗口标题 窗口句柄 TCHAR lpWindowName[]=TEXT("新建 文本文档.txt - 记事本"); HWND hWnd=::FindWindow(NULL,lpWindowName); if(hWnd && IsWindow(hWnd)) ::ShowWindow(hWnd,SW_HIDE); 2.窗口句柄 进程ID 窗口句柄 主线程ID 要使用到的函数: DWORD GetWindowThreadProcessId( HWND hWnd, //目标窗口句柄 LPDWORD lpdwProcessId //返回目标窗口对应进程ID ); 例子: DWORD dwProcId=0;//存放返回的进程ID DWORD dwThreadId=0;//存放返回的主线程ID HWND hWnd=XXXX;//这里省略,可能用任务方式得到一个窗口的句柄.比如用1的方法. dwThreadId=GetWindowThreadProcessId(hWnd,&dwProcId);//同时得到进程ID和主线程ID. 3.窗口HAND CWnd 用CWnd::FromHandle(HWND hWnd)函数.很多类都有这个函数. 4.进程 进程ID (注:进程,即在"任务管理器"看到的字) 用CCheckObject类(详细实现源文件); 例子: 以记事本为例,进程为 NOTEPAD.EXE (不一定是大写哦,得到任务管理器是显示而定); CCheckObject ch; TCHAR Name[]=TEXT("NOTEPAD.EXE"); DWORD dwProcId=ch.GetProcessId(Name); 5. 进程 主线程ID 例子: CCheckObject ch; TCHAR Name[]=TEXT("NOTEPAD.EXE"); DWORD dwThreadId=ch.GetThreadId(Name); 6. 进程 主窗口句柄 CCheckObject ch; TCHAR Name[]=TEXT("NOTEPAD.EXE"); HWND hWnd=ch.GetTargetWindowHanle(Name); 7. 其它说明 从CCheckObject类和上面的源码,不难写出从 进程ID 主线程ID 进程ID 主窗口句柄 主线程ID--->主窗口句柄 等等其它类似转换. 对于主窗口,特点如下: A. 不能用进程ID,要用线程ID,因为一个进程可能有多个线程,每个线程都可能会有主窗口. B. 主窗口不会有WS_CHILD属性 C. 主窗口没有父窗口 D. 主窗口一般都有子窗口(这个不是一定的,但是具有普遍性)

15,473

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧