我想把一个基于对话框的程序绑架到自己的主界面来,写了一个小的测试程序,被绑架窗口上只有按钮的时候用SetParent可以顺利的被设置成我的子窗口,如果被绑架窗口上有树形控件CTreeCtrl的话用SetParent就不起作用了,请问为什么,CTreeCtrl有什么特殊的地方吗?同一个被绑架窗口测试2次,一次有CTreeCtrl,不成功,一次没有CTreeCtrl,成功。
解决方案 »
- 用CSocket的Send先发送一个文件,整个文件发送完毕后,再发送这个文件的CRC32值,用Receive收到的却是CRC32追加到原文件的最后一行得到的新文件???
- 关于椭圆拖动刷新问题
- 求些关于Vc++界面设计实例方面的电子书
- 一个简单问题,菜鸟求救,急急急急!!!!!!!!!!!!!!!
- 如何让写入log文件中的数据是一行一行的(急)
- 在CDialog中放置了一个CButton,并映射了一个CDialog的WM_KEYDOWN消息...
- 急聘vc软件工程师
- 对话框的回调函数中又建一个对话框,运行无法显示对话框全部内容,以及延时窗口,在线求助。
- 我在console程序中#include <Afxtempl.h>以利用CArray,编译成功,但连接出现unresolved external symbol __endthreadex错误
- 调查:现在大家所用的中文输入法是什么?录入速度是多少?
- 请教 ToolTip 的多行实现
- 服务器端怎么同时给N个客户端发数据?
HWND g_hCmdHwnd; // 创建的CMD进程
int CALLBACK EnumWindowsProc(HWND hwnd, LPARAM param)
{
DWORD pID;
// 获取进程ID
DWORD TpID = GetWindowThreadProcessId(hwnd, &pID);
if (TpID == (DWORD)param)
{
g_hCmdHwnd = hwnd; return 0;
}
return 1;
}
//////以下是绑架部分的代码 HANDLE hProcess = NULL;
PROCESS_INFORMATION pi;
STARTUPINFO si; //隐藏进程窗口
si.cb = sizeof(STARTUPINFO);
si.lpReserved = NULL;
si.lpDesktop = NULL;
si.lpTitle = NULL;
si.dwFlags = STARTF_USESHOWWINDOW;
si.wShowWindow = SW_HIDE;
si.cbReserved2 = NULL;
si.lpReserved2 = NULL;
if(::CreateProcess("D:\\DATA\\test\\ccc\\debug\\ccc.exe","",NULL,NULL,FALSE,0,NULL,NULL,&si,&pi))
{
Sleep(1000);
::EnumWindows(&EnumWindowsProc, pi.dwThreadId);//Iterate all windows
}
if(g_hCmdHwnd!=NULL)
{
//绑架它
::SetParent(g_hCmdHwnd,m_wndTradeBar.m_hWnd );
::ShowWindow(g_hCmdHwnd, SW_SHOW);
}
else
{
AfxMessageBox("没找到!");
}
1. 检查是否枚举到需要被绑架的窗口
2. SetParent后需要保存并修改被绑架窗口的风格. 添加WS_CHILD.
3. 脱离绑架前,需要恢复被绑架窗口的风格.
我做过类似的超级容器,可以绑架任何窗口。
{
DWORD pID;
HWND thwnd;
// 获取进程ID
DWORD TpID = GetWindowThreadProcessId(hwnd, &pID);
if (pID == (DWORD)param)
{
while((thwnd=::GetParent (hwnd)) != NULL)
{
hwnd=thwnd;
}
g_hCmdHwnd = hwnd; return 0;
}
return 1;
}
主要是找到目标进程的窗口句柄后再来一个循环,以确保找到的是顶层窗口的句柄。