Codejock Xtreme ToolkitPro v15.0 在HOOK控件后导致滚动条不正常bug及修复

本文探讨了界面库中HOOKWinProc的实现原理及其在界面美化中的应用。通过深入分析SetHook函数,揭示了如何过滤特定窗口类名,并提供了一行代码解决问题的方法。此外,还讨论了在WIN8.1/10上遇到的问题及解决方案。

界面库的原理先搞清楚就好办了,大部分都是采用HOOK WinProc来实现界面美化,所有先从HOOK开始入手,很多问题慢慢就清晰了...

这个深坑有几个月了,一直没闲功夫去认真阅读它的整个代码框架,今天翻阅了一个小时,总算有点头绪了,只需要一行代码即可解决~~

当然,它在WIN8.1/10上面还有无数的坑,原版CODEJOCK记得有不下10处需要改动,其他的慢慢调吧 偷笑 .....

实际上SetHook内部也过滤掉了很多类名,反正在这里也过滤掉你自己的窗口类名就行了

CXTPSkinObject* CXTPSkinManager::SetHook(HWND hWnd, LPCTSTR lpszClassName, LPCREATESTRUCT lpcs, BOOL bAuto)
{
	if (_tcscmp(lpszClassName, _T("tooltips_class32")) == 0)
		return NULL;

	if (_tcsicmp(lpszClassName, _T("IME")) == 0)
		return NULL;

	if(_tcsicmp(lpszClassName,_T("CicMarshalWndClass"))== 0)
		return NULL;

	if(_tcsicmp(lpszClassName,_T("MSCTFIME UI"))== 0)
		return NULL;

	CXTPSkinObject* pSink = NULL;

	if (pSink == NULL && _tcsstr(lpszClassName, _T("WindowsForms")) != NULL)
	{

		CString strClass(lpszClassName);
		int nClassNameStart = strClass.Find(_T('.'));
		int nClassNameEnd = strClass.Find(_T('.'), nClassNameStart + 1);

		if (nClassNameStart != -1 && nClassNameEnd != -1 && nClassNameEnd != nClassNameStart)
		{
			strClass = strClass.Mid(nClassNameStart + 1, nClassNameEnd - nClassNameStart - 1);

			CXTPSkinObjectClassInfo* pInfo = m_pClassMap->Lookup(strClass);

			if (pInfo)
			{
				pSink = pInfo->CreateObject(lpszClassName, lpcs);
			}
		}

		if (pSink == NULL)
		{
			pSink = new CXTPSkinObjectApplicationFrame();
		}

		pSink->m_bWindowsForms = TRUE;
	}

	if (pSink == NULL)
	{
		CXTPSkinObjectClassInfo* pInfo = m_pClassMap->Lookup(lpszClassName);

		if (pInfo)
		{
			pSink = pInfo->CreateObject(lpszClassName, lpcs);
		}
		else
		{
			if (_tcsstr(lpszClassName, _T("Internet Explorer")) != NULL)
				return NULL;

			if (_tcsstr(lpszClassName, _T("OleMainThread")) != NULL)
				return NULL;

			pSink = new CXTPSkinObjectApplicationFrame();
		}
	}

	if (pSink && _tcscmp(lpszClassName, _T("#32770")) == 0)
	{
		((CXTPSkinObjectFrame*)pSink)->m_dwDialogTexture = IsTabPage(lpcs) ? ETDT_ENABLETAB : ETDT_ENABLE;
	}

	if (pSink)
	{

		pSink->m_pManager = this;
		{
			CXTPLockGuard lock(m_csObjects);
			m_mapObjects[hWnd] = pSink;
		}

		pSink->AttachHook(hWnd, lpcs, bAuto);
	}

	return pSink;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

汪宁宇

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值