604
社区成员
发帖
与我相关
我的任务
分享
//---------------------------------------------------------------------------
#define CRNBUFFERMAXLEN 255
//---------------------------------------------------------------------------
// 枚举当前所有窗口的回调函数
BOOL CALLBACK EnumWindowsProc(HWND hWnd, LPARAM lParam)
{
TList *pWndList= (TList *)lParam;
pWndList->Add(hWnd);
return TRUE;
}
//---------------------------------------------------------------------------
// 运行一个应用程序,并获取其主窗口,参数越指明详细越准确
// lpAppFile:应用程序文件名
// lpWndClass:主窗口的类名,可留空
// lpWndText:主窗口的标题,可留空
HWND CrnRunAppAndGetMainWnd(LPSTR lpAppFile, LPSTR lpWndClass, LPSTR lpWndText)
{
PROCESS_INFORMATION pi = { 0 };
STARTUPINFO si = { 0 };
si.cb = sizeof(STARTUPINFO);
si.dwFlags = STARTF_USESHOWWINDOW;
si.wShowWindow = SW_HIDE; // 隐藏进程的窗口先
HWND hRetWnd(NULL);
bool bRet = CreateProcess(NULL, lpAppFile, NULL, NULL, true, 0, 0, NULL, &si, &pi);
if(bRet)
{
// 适当延时,这里暂取1秒,看情况调整
DWORD dwTick = GetTickCount();
while(GetTickCount() - dwTick < 1000)
Application->ProcessMessages();
TList *pWndList = new TList;
try
{
// 列举所有窗口
EnumWindows((WNDENUMPROC)EnumWindowsProc, (long)pWndList);
// 遍历所有顶级窗口,判断该窗口所属进程是否为CreateProcess创建的进程
HWND hWnd;
DWORD dwPID;
int nTextLen;
char szWndClass[CRNBUFFERMAXLEN], szWndText[CRNBUFFERMAXLEN];
// 63 63 72 75 6E 2E 63 6F 6D
for(int i=0; i<pWndList->Count; i++)
{
hWnd = pWndList->Items[i];
GetWindowThreadProcessId(hWnd, &dwPID);
if(dwPID == pi.dwProcessId) // 如果进程相同
{
if(strlen(lpWndClass) > 0) // 判断窗口类名是否与指定的相符
{
GetClassName(hWnd, szWndClass, nTextLen);
if(!strcmp(lpWndClass, szWndClass))
{
hRetWnd = hWnd;
break;
}
}
else // 如指定的窗口类名为空就不判断窗口类名了
{
if(strlen(lpWndText) > 0) // 判断窗口标题是否与指定的相符
{
nTextLen = GetWindowTextLength(hWnd);
if(nTextLen > CRNBUFFERMAXLEN)
nTextLen = CRNBUFFERMAXLEN;
GetWindowText(hWnd, szWndText, nTextLen);
if(!strcmp(lpWndText, szWndText))
{
hRetWnd = hWnd;
break;
}
}
else // 如指定的窗口标题为空就不判断窗口标题了
{
hRetWnd = hWnd;
}
}
}
}
if(hRetWnd == NULL) // 失败鸟,可能没有找到目标窗口
{
TerminateProcess(pi.hProcess, 0);
MessageBox(NULL, "未找到主窗口,程序已关闭.",
"ccrun.com", MB_OK | MB_ICONERROR);
}
}
__finally
{
delete pWndList;
}
}
return hRetWnd;
}
//---------------------------------------------------------------------------
// 将某个顶级窗口捕获到PageControl中
// hWnd:指定的顶级窗口
// pgc:捕获到的PageControl
// lpSheetTitle:TabSheet的标题
void CrnSetWndIntoPageControl(HWND hWnd, TPageControl *pgc, LPSTR lpSheetTitle)
{
TTabSheet *ts = new TTabSheet(pgc);
ts->PageControl = pgc;
ts->Caption = lpSheetTitle;
ts->Show();
::SetParent(hWnd, ts->Handle);
RECT rct;
GetWindowRect(hWnd, &rct);
int nWidth = rct.right - rct.left;
int nHeight = rct.bottom - rct.top;
if(nWidth < 10) nWidth = 10;
if(nHeight < 10) nHeight = 10;
// 63 63 72 75 6E 2E 63 6F 6D
MoveWindow(hWnd, 0, 0, nWidth, nHeight, false);
ShowWindow(hWnd, SW_SHOW);
}
//---------------------------------------------------------------------------
// 测试:运行cmd.exe并将其捕获到PageControl
void __fastcall TForm1::Button1Click(TObject *Sender)
{
LPSTR lpAppFile = "C:\\Windows\\system32\\cmd.exe";
HWND hWnd = CrnRunAppAndGetMainWnd(lpAppFile, "ConsoleWindowClass", "");
if(hWnd)
CrnSetWndIntoPageControl(hWnd, PageControl1, ExtractFileName(lpAppFile).c_str());
}
//---------------------------------------------------------------------------
// 测试:运行notepad.exe并将其捕获到PageControl
void __fastcall TForm1::Button2Click(TObject *Sender)
{
LPSTR lpAppFile = "C:\\Windows\\system32\\notepad.exe";
HWND hWnd = CrnRunAppAndGetMainWnd(lpAppFile, "Notepad", "");
if(hWnd)
CrnSetWndIntoPageControl(hWnd, PageControl1, ExtractFileName(lpAppFile).c_str());
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button3Click(TObject *Sender)
{
LPSTR lpAppFile = "E:\\Tencent\\QQ2008\\qq.exe";
HWND hWnd = CrnRunAppAndGetMainWnd(lpAppFile, "#32770", "QQ用户登录");
if(hWnd)
CrnSetWndIntoPageControl(hWnd, PageControl1, ExtractFileName(lpAppFile).c_str());
}