EnumWindows失败?

liulin2025 2012-12-19 03:06:22
int CALLBACK EnumWindowsProc(HWND hwnd, LPARAM param)
{
DWORD pID;
DWORD TpID = GetWindowThreadProcessId(hwnd, &pID);//get process id
if (TpID == (DWORD)param)
{
apphwnd=hwnd;//hwnd is the window handle
SetEvent(g_hEvent);
return false;
}
ResetEvent(g_hEvent);
return true;
}

::EnumWindows(&EnumWindowsProc, processInfo.dwThreadId);//Iterate all windows


设置了断点,跑了很久,一直不退出

...全文
249 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
liulin2025 2012-12-22
  • 打赏
  • 举报
回复
引用 9 楼 BeanJoy 的回复:
你要早上代码,早解决了: C/C++ code?123456 { /* success */ WaitForInputIdle(processInfo.hProcess, INFINITE); ::EnumWindows(&EnumWindowsProc, processInfo.dwThreadId);//Itera……
多谢你了啊,呵呵 我试试啊,
liulin2025 2012-12-21
  • 打赏
  • 举报
回复
引用 5 楼 BeanJoy 的回复:
C/C++ code?1DWORD TpID = GetWindowThreadProcessId(hwnd, &pID);//get process id 这句是得到创建hwnd这个窗口的线程ID(TpID)和进程ID(pID),你确定如下 C/C++ code?1::EnumWindows(&EnumWindowsProc, processInfo……
确定啊,我是打开某个程序后,这个程序有窗口,打开的同时我的程序就会枚举窗口 附上代码:
HANDLE handle;//process handle
HWND apphwnd;//window handle

/*************Global functions for hosting******************/
//Function to enumerate all windows.
int CALLBACK EnumWindowsProc(HWND hwnd, LPARAM param)
{
	DWORD pID;
	DWORD TpID = GetWindowThreadProcessId(hwnd, &pID);//get process id
	if (TpID == (DWORD)param)
	{
		apphwnd=hwnd;//hwnd is the window handle
		SetEvent(g_hEvent);
		return false;
	}
	ResetEvent(g_hEvent);
	return true;
}


//Functio to start a orocess and return the process handle
HANDLE StartProcess(LPCTSTR program, LPCTSTR args)
{

	HANDLE hProcess = NULL;
	PROCESS_INFORMATION processInfo;
	STARTUPINFO startupInfo;
	::ZeroMemory(&startupInfo, sizeof(startupInfo));
	startupInfo.cb = sizeof(startupInfo);
	startupInfo.dwFlags=STARTF_USESHOWWINDOW;
	startupInfo.wShowWindow=SW_HIDE;
	if(::CreateProcess(program, (LPTSTR)args, 
		NULL,  // process security
		NULL,  // thread security
		FALSE, // no inheritance
		0,     // no startup flags
		NULL,  // no special environment
		NULL,  // default startup directory
		&startupInfo,
		&processInfo))
	{ /* success */

		::EnumWindows(&EnumWindowsProc, processInfo.dwThreadId);//Iterate all windows
		hProcess = processInfo.hProcess;

	} /* success */
	return hProcess;
}

/**********************************************************/
//handle for host menu
void CHostMSPaintDlg::OnActionHostmspaint() 
{
	CRect rect;
	DWORD nRet=-1;
	g_hEvent=CreateEvent(NULL,FALSE,FALSE,NULL);
	GetClientRect(&rect);//get our dialog size into rect
	handle=StartProcess(NULL,"C:\\Program Files\\Microsoft Office\\Office12\\WINWORD.EXE	c:\\操作word的类.docx");//Start ms paint
	nRet=WaitForSingleObject(g_hEvent,5000);				//waited the target window for 2000 ms
	CloseHandle(g_hEvent);

	if(nRet!=WAIT_OBJECT_0)
	{
			::MessageBox(NULL,_T("启动word,超时!"),_T("错误提示"),MB_ICONEXCLAMATION);
			SendMessage(WM_CLOSE,0,0);
			return;
	}
	if(apphwnd!=NULL)//check for window handle
	{
		::SetParent(apphwnd,m_hWnd);//set parent of ms paint to our dialog.
		SetWindowLong(apphwnd, GWL_STYLE, WS_VISIBLE);//eraze title of ms paint window.
		//Positioning ms paint.
		::MoveWindow(apphwnd, rect.left, rect.top,rect.right, rect.bottom, true);
		::ShowWindow(apphwnd,SW_SHOW);

	}
	else//no window for our process
		MessageBox("Cannot find Window");	
}
有兴趣的可以自己做个实验
liulin2025 2012-12-21
  • 打赏
  • 举报
回复
引用 4 楼 VisualEleven 的回复:
设置了断点,跑了很久,一直不退出 ----------------------------- 那不是说明EnumWindows函数调用成功了么~
晕你弄反了,
BeanJoy 2012-12-21
  • 打赏
  • 举报
回复
你要早上代码,早解决了:

    { /* success */
		
	WaitForInputIdle(processInfo.hProcess, INFINITE);
        ::EnumWindows(&EnumWindowsProc, processInfo.dwThreadId);//Iterate all windows
        hProcess = processInfo.hProcess;
    } /* success */
加上WaitForInputIdle这个,CreateProcessr后,立即去找窗口,可能会找不到,那个进程都可能还没被加载进内存,你怎么能找到?
傻X 2012-12-20
  • 打赏
  • 举报
回复
你互斥肯定没做好,代码贴少了
BeanJoy 2012-12-20
  • 打赏
  • 举报
回复
DWORD TpID = GetWindowThreadProcessId(hwnd, &pID);//get process id
这句是得到创建hwnd这个窗口的线程ID(TpID)和进程ID(pID),你确定如下
::EnumWindows(&EnumWindowsProc, processInfo.dwThreadId);//Iterate all windows
processInfo.dwThreadId这个线程有创建过窗口?
Eleven 2012-12-20
  • 打赏
  • 举报
回复
设置了断点,跑了很久,一直不退出 ----------------------------- 那不是说明EnumWindows函数调用成功了么~
liulin2025 2012-12-20
  • 打赏
  • 举报
回复
引用 2 楼 zhoujielunzhimi 的回复:
那就说明,死循环?
明明要枚举的窗口已经打开了,出现了啊。 为什么还失败
sumos 2012-12-19
  • 打赏
  • 举报
回复
那就说明,死循环?

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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