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;}
为什么这样,不能正确得到窗口的HWND,网上说了 GetWindowThreadProcessId这个得到的是线程ID,那怎么得到进程ID呢?
解决方案 »
- 怎么删除对话框上自助创建的控件
- 怎么建立c++项目的单元测试
- 水晶报表显示只显示一页,需要显示所有的页面的问题
- [关于MFC中 tree control 获取选中项序号的问题,大家帮我看看 谢谢了,谢谢谢谢,谢谢谢谢,谢谢谢谢,谢谢谢谢,谢谢谢谢,谢谢谢谢,谢谢谢谢]
- 冬至节到散分
- 如何判断socekt连接断连
- 如何关闭对话框后再显示对话框时,对话框的参数值不变
- 查询sqlserver2000中数据时,为什么会出现“对于造型说明无效的字符值”这种错误!!急
- 请webber84(***闭关修炼中***)进来领分,谢谢!
- !!!!!!!!!! 微软邓予心女士推荐来此处求解!希望得到微软技术专家及各位高手的帮助!谢了!
- 如何获取线程外 窗口里的控件句柄
- 关于WebBrowser的DocumentComplete
那我的是正确的吧郁闷中啊
郁闷的
if(pInfo->dwProcessId==dwProcessId)
{
HWND pHwnd=::GetParent(hwnd);
HWND oldhwnd=hwnd;
while(pHwnd)
{
oldhwnd=pHwnd;
pHwnd=::GetParent(oldhwnd);
}
pInfo->hWnd=oldhwnd;
return false;
}
DWORD GetSpecifiedProcessId(const char *pszProcessName)
{
DWORD id;
//获得系统快照句柄 (通俗的讲, 就是得到当前的所有进程)
HANDLE hSnapShot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0) ;
PROCESSENTRY32 pInfo; //用于保存进程信息的一个数据结构
pInfo.dwSize = sizeof(pInfo);
//从快照中获取进程列表
Process32First(hSnapShot, &pInfo) ; //从第一个进程开始循环
do
{
//这里的 pszProcessName 为你的进程名称
if(strcmp(strlwr(_strdup(pInfo.szExeFile)), pszProcessName) == 0)
{
id = pInfo.th32ProcessID ;
break ;
}
}while(Process32Next(hSnapShot, &pInfo) != FALSE);
return id; //id 就是你要的进程PID 了..
}
自己实现了
不知道这个代码有什么错误,暂时没过多的测试
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;}