16,472
社区成员
发帖
与我相关
我的任务
分享
typedef struct tagWNDINFO
{
DWORD dwProcessId;
HWND hWnd;
} WNDINFO, *LPWNDINFO;
BOOL CALLBACK EnumWndProc(HWND hwnd,LPARAM lParam);
void xxxx::run_proc(void)
{
CString szFilePath;
szFilePath.Format(_T("C:\\windows\\notepad.exe"));
STARTUPINFO strinfo;
memset(&strinfo,0,sizeof(STARTUPINFO));//这句不可少
strinfo.cb=sizeof(STARTUPINFO);
::GetStartupInfo(&strinfo);
strinfo.wShowWindow=SW_SHOWNORMAL;
strinfo.dwFlags=STARTF_USESHOWWINDOW | STARTF_USESTDHANDLES;
PROCESS_INFORMATION Process_Info;
CreateProcessW(szFilePath,NULL,NULL,NULL,true,NULL,NULL,NULL,&strinfo,&Process_Info);
WNDINFO wndf;
wndf.dwProcessId=Process_Info.dwProcessId;
wndf.hWnd=NULL;
EnumWindows(EnumWndProc,(LPARAM)&wndf);
TRACE("handle ==>%x id ==>%x ==>%x\r\n",Process_Info.hProcess,Process_Info.dwProcessId,wndf.hWnd);
}
BOOL CALLBACK EnumWndProc(HWND hwnd,LPARAM lParam)
{
DWORD dwProcessId;
GetWindowThreadProcessId(hwnd, &dwProcessId);
TRACE("Process id==>%x \r\n",dwProcessId);
LPWNDINFO pInfo = (LPWNDINFO)lParam;
if(pInfo->dwProcessId==dwProcessId)
{
TRACE("<===========================>");
pInfo->hWnd=hwnd;
return false;
}
else
return true;
}
自己实现了
不知道这个代码有什么错误,暂时没过多的测试
void CdemoDlg::run_proc(void)
{
CString szFilePath;
szFilePath.Format(_T("C:\\windows\\notepad.exe"));
STARTUPINFO strinfo;
memset(&strinfo,0,sizeof(STARTUPINFO));//这句不可少
strinfo.cb=sizeof(STARTUPINFO);
::GetStartupInfo(&strinfo);
strinfo.wShowWindow=SW_SHOWNORMAL;
strinfo.dwFlags=STARTF_USESHOWWINDOW | STARTF_USESTDHANDLES;
PROCESS_INFORMATION Process_Info;
CreateProcessW(szFilePath,NULL,NULL,NULL,false,NULL,NULL,NULL,&strinfo,&Process_Info);
WNDINFO wndf;
wndf.dwProcessId=Process_Info.dwProcessId;
wndf.hWnd=NULL;
int x=0;
while(!wndf.hWnd&&x<1000)
{
EnumWindows(EnumWndProc,(LPARAM)&wndf);
Sleep(10);
x++;
}
TRACE("x=> %d",x);
//WaitForInputIdle(Process_Info.hProcess, INFINITE);
WINDOWPLACEMENT wpment;
wpment.length=sizeof(wpment);
::GetWindowPlacement(wndf.hWnd,&wpment);
wpment.showCmd=SW_SHOWMAXIMIZED;
::SetWindowPlacement(wndf.hWnd,&wpment);
TRACE("handle ==>%x id ==>%x ==>%x\r\n",Process_Info.hProcess,Process_Info.dwProcessId,wndf.hWnd);
}
BOOL CALLBACK EnumWndProc(HWND hwnd,LPARAM lParam)
{
if(!::IsWindow(hwnd))
return true; //不是窗口,直接返回,查找下一个
if(!::IsWindowVisible(hwnd))
return true;//不是可见窗口,直接返回,查找下一个
DWORD dwProcessId;
GetWindowThreadProcessId(hwnd, &dwProcessId);
LPWNDINFO pInfo = (LPWNDINFO)lParam;
if(pInfo->dwProcessId==dwProcessId)
{
HWND pHwnd=::GetParent(hwnd);
HWND oldhwnd=hwnd;
while(pHwnd)
{
oldhwnd=pHwnd;
pHwnd=::GetParent(oldhwnd);
}
pInfo->hWnd=oldhwnd;
return false;
}
else
return true;
}
if(pInfo->dwProcessId==dwProcessId)
{
HWND pHwnd=::GetParent(hwnd);
HWND oldhwnd=hwnd;
while(pHwnd)
{
oldhwnd=pHwnd;
pHwnd=::GetParent(oldhwnd);
}
pInfo->hWnd=oldhwnd;
return false;
}