关于让任意程序,在类似IE7或者Maxthon那样的多标签窗口中运行。

FigoZhu 2008-07-01 06:53:35
起因是这样的。
我在公司使用SIPp进行测试,它是命令行的工具。
我在同一台机器上,需要运行2个SIPp,一个作为UAS,一个作为UAC。

有没有什么办法,把cmd这个程序,弄成类似IE7或Maxthon,或者SecureCRT那样的多Table界面?
...全文
779 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
lishuaxin 2012-01-02
  • 打赏
  • 举报
回复
谢谢妖哥不嫌弃菜鸟,在百忙之中给予回复。我提的这个要求对我自己来说难于登天,我花了很长时间在网上查找相关内容,一直未找到,但找到了你对很多网友提问的解答,甚至有些网友对难题得不到很好的回答,就建议去请教妖哥,因此我便推测妖哥不仅是专业高手,更是乐于助人,故冒昧发此帖。果然如我所想,妖哥既专业又热心,按我这菜鸟现状,很难解决这个问题,还请妖哥抽空帮助解决一下。谢谢妖哥!
ccrun.com 2012-01-02
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 lishuaxin 的回复:]
我是刚进入BCB的菜鸟,看了妖哥“关于让任意程序,在类似IE7或者Maxthon那样的多标签窗口中运行”,模仿着做了一下,居然成功了。我知道妖哥为论坛解决了许多疑难杂症,是个高手,我想请教一个例子:我在模仿例子时碰到一个难题:一个外部EXE有登陆窗口和主窗体,如何将登陆窗口嵌入TabSheet1并等待输入用户信息和密码后点击确定按钮进入主窗口,此时将主窗口再嵌入TabSheet1(同一页,此时登陆……
[/Quote]

你这个需求确实有些难度,多个窗口的创建与销毁,需要用hook才能准确的得知时机。
lishuaxin 2012-01-02
  • 打赏
  • 举报
回复
我是刚进入BCB的菜鸟,看了妖哥“关于让任意程序,在类似IE7或者Maxthon那样的多标签窗口中运行”,模仿着做了一下,居然成功了。我知道妖哥为论坛解决了许多疑难杂症,是个高手,我想请教一个例子:我在模仿例子时碰到一个难题:一个外部EXE有登陆窗口和主窗体,如何将登陆窗口嵌入TabSheet1并等待输入用户信息和密码后点击确定按钮进入主窗口,此时将主窗口再嵌入TabSheet1(同一页,此时登陆窗口已释放了,我不知道是否可行)。
rickys2080 2011-07-27
  • 打赏
  • 举报
回复
mark
明朝2013 2010-12-28
  • 打赏
  • 举报
回复
收了。。。
宝龙哥 2010-12-13
  • 打赏
  • 举报
回复
哎呀,高阿!
VCACC 2010-12-10
  • 打赏
  • 举报
回复
收藏先,慢慢欣赏
VCACC 2010-12-09
  • 打赏
  • 举报
回复
又见高手
__lhy 2010-12-08
  • 打赏
  • 举报
回复
mark
|????| 2010-12-08
  • 打赏
  • 举报
回复
Mark
FigoZhu 2008-07-22
  • 打赏
  • 举报
回复
谢谢妖哥了。
FigoZhu 2008-07-02
  • 打赏
  • 举报
回复
嗯,谢谢妖哥啦~
偶回去就试试。
ccrun.com 2008-07-02
  • 打赏
  • 举报
回复
还有个问题需要解决,就是当捕获的应用程序关闭以后,应该把相应的TabSheet也删掉。以及关闭本程序时,将相应打开的进程也关掉。
laowang2 2008-07-02
  • 打赏
  • 举报
回复
关注中。。。。。。
Waiting4you 2008-07-01
  • 打赏
  • 举报
回复
“适当延时,这里暂取1秒,看情况调整”后面的三句貌似可以用这个API来实现?
DWORD WINAPI WaitForInputIdle(
HANDLE hProcess,
DWORD dwMilliseconds
);

:-P
ccrun.com 2008-07-01
  • 打赏
  • 举报
回复
我解释一下,上面这段代码,功能是运行一个指定的应用程序,然后找到其主窗口(这个有难度,准确率不是太高),再将这个主窗口捕获到自己窗口的PageControl中。

CrnRunAppAndGetMainWnd函数是运行应用程序并企图找到其主窗口,首先用CreateProcess创建进程(不显示窗口),略等待后用EnumWindows枚举所有顶级窗口,并通过GetWindowThreadProcessId获取到窗口的进程ID和前面创建的进程作比较,如相同则认为是这个进程的主窗口(这一步有些牵强,并且更好的方法应该是通过钩子来获取窗口的创建/销毁等信息),为了再准确一些找到主窗口(一个进程可能有N个窗口),再通过对比窗口的类名和标题。最终如果成功的找到"主窗口",将其返回。

CrnSetWndIntoPageControl函数主要是将一个已知句柄的窗口"放到"指定的PageControl中,主要用了API: SetParent函数。然后用MoveWindow将其挪动到相对位置的左上角,再用ShowWindow显示出来。

基本就是这样子,CrnRunAppAndGetMainWnd有一些功能还需改进。明白大概的思想就可以了。
ccrun.com 2008-07-01
  • 打赏
  • 举报
回复
//---------------------------------------------------------------------------
#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());
}
Waiting4you 2008-07-01
  • 打赏
  • 举报
回复
流口水期待中...
ccrun.com 2008-07-01
  • 打赏
  • 举报
回复
我正在给你写一段代码来搞定这个事情。晚一些发上来,做饭去了先。
傲游浏览器(Maxthon Browser), 是一款功能丰富的多标签浏览器。傲游浏览器允许在同一窗口内打开任意多个页面, 减少浏览器对系统资源的占用率, 提高网上冲浪的效率. 傲游基于IE内核开发, 这意味着您可以在傲游浏览器看到和 IE 一致的效果, 并能正常使用网银等支付手段. 同时, 傲游浏览器还能有效防止恶意插件, 阻止弹窗和浮动广告, 加强网上浏览的安全. 傲游浏览器支持各种外挂工具及 IE 插件, 使你可以充分利用所有的网上资源. 此外, 丰富的皮肤和强大的自定义功能让你在享受上网冲浪的乐趣之余, 充分展现个性与时尚. 2.5.8 [UI] 修正合并后的刷新停止按钮在快速访问页显示为停止状态的问题 修复Internet选项有时无法打开的问题 [核心] 修复一个可能导致崩溃的问题 修复Turkish Q键盘布局下,小键盘6输入的问题 [静音] 提高了静音方法的效率 解决了一个导致崩溃的问题 [快速访问] 支持新窗口打开网页(鼠标键,右键菜单) 搜索框添加了右键菜单(粘帖并搜索) 修复有时候九宫格的URL会因为页面跳转发生改变的问题 修复有时候九宫格内容没有保存的问题 [浮动按钮] 修复了一个可能导致内存泄漏的问题 ◆傲游2优化版特点: 1:更新广告过滤规则,解决了部分网站的兼容问题 2:全面更新广告过滤包,每一个广告过滤包都已经更新到了最新版本 3:集成多款漂亮的皮肤 4:启用在新窗口打开地址栏链接 5:更新所有的插件到最新

604

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder VCL组件使用和开发
社区管理员
  • VCL组件使用和开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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