MFC钩子改变其他程序主窗口背景

HDSHAOWH 2016-10-22 12:58:52
首先说下我的方法,我先通过FindWindow获取窗口句柄,然后安装钩子,在钩子回调里进行窗口子类化。在子类化过的窗口过程函数现在已经能获取到WM_PAINT,WM_ERASEBKGND消息,目前可以对一些普通窗口改色。

问题是单位要求改的主窗口是透明的,就算我在WM_ERASEBKGND里绘制也没效果;有没有把透明样式搞掉的啊?
我都想再自己创建个窗口,然后让原先的主窗口成为child类型,但不知道怎么实行。

请高手或这方面有经验的给个建议。实在搞不动了。
...全文
160 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
HDSHAOWH 2016-10-23
  • 打赏
  • 举报
回复
谢谢schlafenhamster ,研究了两天估计那界面是UpdateLayeredWindow,SetLayeredWindowAttributes类似的搞透明的,所以自绘消息扑捉到也没用。
schlafenhamster 2016-10-22
  • 打赏
  • 举报
回复
“”改的主窗口是透明的“” 上传 这个窗口的 图。
lx624909677 2016-10-22
  • 打赏
  • 举报
回复
是想让整个窗口都透明?可以试试:SetLayeredWindowAttributes
HDSHAOWH 2016-10-22
  • 打赏
  • 举报
回复
引用 10 楼 schlafenhamster 的回复:
其中

//
void CTransDlgDlg::RgnSubtractCtrls(CRgn &rgn,int offX,int offY)
{
	CWnd *pWnd;
	int ID[]={IDOK,IDCANCEL,IDC_BUTTON1};// list all ctrls's id here !
	for(int jj=0;jj< sizeof(ID)/sizeof(int);jj++)
	{
		pWnd=GetDlgItem(ID[jj]);
		CRect rc;
		pWnd->GetWindowRect(&rc);
		ScreenToClient(&rc);
		rc.OffsetRect(offX,offY);
//
		CRgn ctlRgn;
		ctlRgn.CreateRectRgnIndirect(&rc);
		rgn.CombineRgn(&rgn,&ctlRgn,RGN_XOR);
		DeleteObject(ctlRgn);
	} 
}
是保证控件 不透明 。
我对主窗口SetWindowRgn(hWnd, 0,TRUE);没用还是透明,在主窗口创建一个控件也被mask掉了。估计只能在他进程里创建个主窗口,然后把那个透明的设置为child
schlafenhamster 2016-10-22
  • 打赏
  • 举报
回复
“透明对话框 ” http://download.csdn.net/detail/schlafenhamster/7131813 “Transparent 对话框, 一个可以从不透明到透明切换的对话框例子”
schlafenhamster 2016-10-22
  • 打赏
  • 举报
回复
其中

//
void CTransDlgDlg::RgnSubtractCtrls(CRgn &rgn,int offX,int offY)
{
	CWnd *pWnd;
	int ID[]={IDOK,IDCANCEL,IDC_BUTTON1};// list all ctrls's id here !
	for(int jj=0;jj< sizeof(ID)/sizeof(int);jj++)
	{
		pWnd=GetDlgItem(ID[jj]);
		CRect rc;
		pWnd->GetWindowRect(&rc);
		ScreenToClient(&rc);
		rc.OffsetRect(offX,offY);
//
		CRgn ctlRgn;
		ctlRgn.CreateRectRgnIndirect(&rc);
		rgn.CombineRgn(&rgn,&ctlRgn,RGN_XOR);
		DeleteObject(ctlRgn);
	} 
}
是保证控件 不透明 。
schlafenhamster 2016-10-22
  • 打赏
  • 举报
回复

void CTransDlgDlg::OnButton1() 
{
	// TODO: Add your control notification handler code here
static BOOL sw=FALSE;
	if(!sw)
	{
		sw=TRUE;
		CRect rcWin;
		GetWindowRect(&rcWin);
//
		CRect rcClt;
		GetClientRect(&rcClt);
//		rcClt.DeflateRect(20,20);
		ClientToScreen(rcClt);
		rcClt.OffsetRect(-rcWin.left,-rcWin.top);
//
		int offX=rcClt.left;
		int offY=rcClt.top;
		rcWin.OffsetRect(-rcWin.left,-rcWin.top);
//
		CRgn tmp;
		tmp.CreateRectRgnIndirect(&rcClt);
// client - ctrls
		RgnSubtractCtrls(tmp,offX,offY);
// finally
		CRgn rgn;
		rgn.CreateRectRgnIndirect(&rcWin);
		rgn.CombineRgn(&rgn,&tmp,RGN_DIFF);
		DeleteObject(tmp);
// 
		SetWindowRgn(rgn,TRUE);
		m_Trans.SetWindowText("不透明");
	}
	else
	{
		sw=FALSE;
		SetWindowRgn(0,TRUE);
		m_Trans.SetWindowText("透明");
	}
}
使窗口透明和不透明就是 SetWindowRgn(rgn,TRUE); SetWindowRgn(0,TRUE); 对窗口调用 SetWindowRgn(0,TRUE); 就是 不透明。
HDSHAOWH 2016-10-22
  • 打赏
  • 举报
回复
引用 6 楼 schlafenhamster 的回复:
"所有的按钮和那个白色的" 都是控件的话 ,应该有个 父窗口。 “现在要把他们所属的父窗口颜色(现在是透明)” 我看 只是 父窗口有一个 背景图 而已,不会是透明的。
但是你也看到了啊,是透明的,后面的图片是我桌面背景。我估计父窗口set mask之类的透明掉了。不能绘制其他颜色了
worldy 2016-10-22
  • 打赏
  • 举报
回复
吃饱撑着的
schlafenhamster 2016-10-22
  • 打赏
  • 举报
回复
"所有的按钮和那个白色的" 都是控件的话 ,应该有个 父窗口。 “现在要把他们所属的父窗口颜色(现在是透明)” 我看 只是 父窗口有一个 背景图 而已,不会是透明的。
HDSHAOWH 2016-10-22
  • 打赏
  • 举报
回复
引用 4 楼 schlafenhamster 的回复:
你是说 所有按钮 的 紫色 要 改为 背景 色 ?
不是,所有的按钮和那个白色的应该有个父窗口对吧,现在要把他们所属的父窗口颜色(现在是透明)改掉。
schlafenhamster 2016-10-22
  • 打赏
  • 举报
回复
你是说 所有按钮 的 紫色 要 改为 背景 色 ?
HDSHAOWH 2016-10-22
  • 打赏
  • 举报
回复

紫色的是要修改的程序,透明镂空的

15,980

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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