思路:
首先,需要用CreateProcess或者ShellExecute执行exe程序。
然后,用FindWindow找到该exe程序的窗口句柄。
最后,根据得到的窗口句柄,用SetWindowPos或者MoveWindow控制该窗口的显示位置及大小
一 调用EXE程序的方法:
1.使用system函数
2.使用execl或execv函数
3.使用WinExec函数
4.使用CreateProcess函数
5.使用ShellExecuteEx函数
二 WND hWnd1 = ::FindWindow(NULL, _T("13643.pdf - Adobe Reader"));
找到窗口句柄,这里使用的是参数二就是窗口框的标题名称,其实标题名称是可以改变的,应该使用参数一,类名进行查找这个EXE的窗口句柄(有待完善)
三 ::SetWindowPos(hWnd1,NULL,10,10,200,200,NULL);利用API的函数来设置窗口位置,因为他的第一个参数是hwnd句柄可以直接使用.
当在使用SetWindowPos时候 他的第一个参数是cwnd,所以必须把句柄hwnd转换成为窗口类cwnd.(有待完善)
代码:
SHELLEXECUTEINFO ShExecInfo = {0};
ShExecInfo.cbSize = sizeof(SHELLEXECUTEINFO);
ShExecInfo.fMask = SEE_MASK_NOCLOSEPROCESS;
//ShExecInfo.hwnd = NULL;
ShExecInfo.hwnd = this->m_hWnd;
ShExecInfo.lpVerb = _T("open");
ShExecInfo.lpFile = _T("E:\\13643.pdf");
ShExecInfo.lpParameters = _T("-f train");
ShExecInfo.lpDirectory = NULL;
ShExecInfo.nShow = SW_SHOW;// SW_HIDE;// SW_MAXIMIZE;// SW_HIDE;
ShExecInfo.hInstApp = NULL;
ShellExecuteEx(&ShExecInfo);
// BeginWaitCursor(); //让鼠标进入忙碌状态
// WaitForSingleObject(ShExecInfo.hProcess,INFINITE);//等待结束
// EndWaitCursor(); //让鼠标进入XX状态
Sleep(2000); //延时2秒时为了让调用的EXE运行起来,这里应该写成检测进程是否有,然后再设置位置。(有待完善)
HWND hWnd1 = ::FindWindow(NULL, _T("13643.pdf - Adobe Reader")); //通过窗口的文本标题获得窗口句柄
// CWnd *pWnd;
// pWnd = CWnd::FromHandle(hWnd1); //HWND->CWnd 我这么转了一次hwnd到cwnd但是改变的是我的EXE而不是调用的
/ /SetWindowPos(hWnd1,0,0,100,100,SWP_DRAWFRAME);
::SetWindowPos(hWnd1,NULL,10,10,200,200,NULL);