/******************************************************************
$Archive: /MfcExt/Source/CoolControlsManager.cpp $
$Workfile: CoolControlsManager.cpp $
$Author: Bogdan Ledwig $
$Date: 99-04-26 22:12 $
$Revision: 13 $
*******************************************************************/
#include "StdAfx.h"
#include "CoolControlsManager.h"
// If you don't want to see extra TRACE diagnostics,
// modify the line below to: #define CCM_TRACE
#define CCM_TRACE TRACE
#define CCM_TIMER_VAL 100 // 100 ms timer period seems to be good enough...
#define MAX_CLASSNAME 64 // Length of buffer for retrieving the class name
////////////////////////////////////////////////////////////////////////
// CCMControl static members initialization
HWND CCoolControlsManager::CCMControl::m_hWndOld = NULL;
CMapPtrToPtr CCoolControlsManager::m_ctrlMap = 10;
CMapPtrToPtr CCoolControlsManager::m_dlgMap = 10;
BOOL CCoolControlsManager::m_bEnabled = TRUE;
// Changed 02.03.1999 Mike Walter
CMapWordToPtr CCoolControlsManager::m_threadMap = 10;
///////////////////////////////////////////////////////////////////////
// Here is the one and only CCoolControlsManager object
static CCoolControlsManager g_ctrlManager;
CCoolControlsManager& GetCtrlManager()
{
return g_ctrlManager;
}
////////////////////////////////////////////////////////////////////////
// WH_CALLWNDPROC hook procedure
LRESULT CALLBACK CCM_CallWndProc( int nCode, WPARAM wParam, LPARAM lParam )
{
HOOKPROC hHookProc;
if ( g_ctrlManager.m_threadMap.Lookup( (WORD)GetCurrentThreadId(), (void*&)hHookProc ) == FALSE )
{
// TRACE( "CCoolControlsManager: No hook for this thread installed!\n" );
return 0;
}
if ( nCode == HC_ACTION )
{
CWPSTRUCT* pwp = (CWPSTRUCT*)lParam;
if ( g_ctrlManager.IsEnabled() )
{
if ( g_ctrlManager.m_bDialogOnly == TRUE )
{
if ( pwp->message == WM_INITDIALOG )
g_ctrlManager.Install( pwp->hwnd );
}
else if ( pwp->message == WM_CREATE && g_ctrlManager.IsEnabled() )
{
TCHAR szBuf[MAX_CLASSNAME];
if ( GetWindowLong( pwp->hwnd, GWL_STYLE ) & WS_CHILD )
{
GetClassName( pwp->hwnd, szBuf, MAX_CLASSNAME );
if ( lstrcmp( szBuf, _T( "ScrollBar" ) ) ) // Don't add scrollbars
g_ctrlManager.AddControl( pwp->hwnd );
}
}
}
}
// Changed 02.03.1999 Mike Walter
return CallNextHookEx( (HHOOK)hHookProc, nCode, wParam, lParam );
}
// Install a hook for the current thread only
void CCoolControlsManager::InstallHook( DWORD dwThreadID, BOOL bDialogOnly )
{
// ASSERT( m_hkWndProc == NULL );
m_bDialogOnly = bDialogOnly;
// Changes 02.03.1999 Mike Walter
HOOKPROC hNewHook;
if ( m_threadMap.Lookup( (WORD)( dwThreadID == -1 ? GetCurrentThreadId() : dwThreadID ), (void*&)hNewHook ) == FALSE )
{
hNewHook = (HOOKPROC)SetWindowsHookEx( WH_CALLWNDPROC,
(HOOKPROC)CCM_CallWndProc,
NULL,
( dwThreadID == -1 ? GetCurrentThreadId() : dwThreadID ) );
m_threadMap.SetAt( (WORD)( dwThreadID == -1 ? GetCurrentThreadId() : dwThreadID ), hNewHook );
CCM_TRACE( "CCoolControlsManager: WH_CALLWNDPROC hook installed for thread: %d\n", ( dwThreadID == -1 ? GetCurrentThreadId() : dwThreadID ) );
}
else
CCM_TRACE( "CCoolControlsManager: WH_CALLWNDPROC hook already installed for thread: %d!\n", ( dwThreadID == -1 ? GetCurrentThreadId() : dwThreadID ) );
}
// Install a global hook for all windows in the system.
// This function may be called only when is put in a DLL.
void CCoolControlsManager::InstallGlobalHook( HINSTANCE hInstance, BOOL bDialogOnly )
{
ASSERT( hInstance ); // hInstance must not be NULL!
ASSERT( m_hkWndProc == NULL );
m_bDialogOnly = bDialogOnly;
HOOKPROC hkProc = (HOOKPROC)GetProcAddress( hInstance, "CCM_CallWndProc" );
m_hkWndProc = (HOOKPROC)SetWindowsHookEx( WH_CALLWNDPROC,
(HOOKPROC)hkProc,
hInstance,
0 );
CCM_TRACE( _T( "CCoolControlsManager: WH_CALLWNDPROC global hook installed\n" ) );
}
void CCoolControlsManager::UninstallHook( DWORD dwThreadID )
{
// ASSERT( m_hkWndProc != NULL );
// Changes 02.03.1999 Mike Walter
HOOKPROC hHookProc;
if ( dwThreadID == -1 )
{
if ( g_ctrlManager.m_threadMap.Lookup( (WORD)GetCurrentThreadId(), (void*&)hHookProc ) == FALSE )
{
CCM_TRACE( "CCoolControlsManager: No hook installed for thread: %d!\n", GetCurrentThreadId() );
return;
}
UnhookWindowsHookEx( (HHOOK)hHookProc );
m_threadMap.RemoveKey( (WORD)GetCurrentThreadId() );
CCM_TRACE( "CCoolControlsManager: Hook uninstalled for thread: %d\n", GetCurrentThreadId() );
CCM_TRACE( "CCoolControlsManager: Thread map has %d items\n",g_ctrlManager.m_threadMap.GetCount() );
}
else
{
if ( g_ctrlManager.m_threadMap.Lookup( (WORD)dwThreadID, (void*&)hHookProc) == FALSE )
{
CCM_TRACE( "CCoolControlsManager: No hook installed for thread: %d!\n", dwThreadID );
return;
}
UnhookWindowsHookEx( (HHOOK)hHookProc );
m_threadMap.RemoveKey( (WORD)dwThreadID );
CCM_TRACE( "CCoolControlsManager: Hook uninstalled for thread: %d\n", dwThreadID );
CCM_TRACE( "CCoolControlsManager: Thread map has %d items\n", g_ctrlManager.m_threadMap.GetCount() );
}
if ( m_uTimerID && g_ctrlManager.m_threadMap.IsEmpty() == TRUE )
KillTimer( NULL, m_uTimerID );
}
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
CCoolControlsManager::CCoolControlsManager()
{
m_hkWndProc = NULL;
m_uTimerID = 0;
CCM_TRACE( _T( "CCoolControlsManager::CCoolControlsManager()\n" ) );
}
CCoolControlsManager::~CCoolControlsManager()
{
// Changed 02.03.1999 Mike Walter
POSITION pos = m_threadMap.GetStartPosition();
while ( pos )
{
HOOKPROC hHook;
DWORD dwThreadID = 0;
m_threadMap.GetNextAssoc( pos, (WORD&)dwThreadID, (void*&)hHook );
UninstallHook( dwThreadID );
}
// If we have any elements in the map (normally impossible), unsubclass they and remove
pos = m_ctrlMap.GetStartPosition();
while ( pos )
{
HWND hWnd;
CCMControl* pCtl;
m_ctrlMap.GetNextAssoc( pos, (void*&)hWnd, (void*&)pCtl );
pCtl->Unsubclass();
m_ctrlMap.RemoveKey( hWnd );
delete pCtl;
}
// Now do the same things for dialog map
pos = m_dlgMap.GetStartPosition();
while ( pos )
{
HWND hWnd;
CCMDialog* pCtl;
m_dlgMap.GetNextAssoc( pos, (void*&)hWnd, (void*&)pCtl );
pCtl->Unsubclass();
m_dlgMap.RemoveKey( hWnd );
delete pCtl;
}
CCM_TRACE( "CCoolControlsManager::~CCoolControlsManager()\n" );
}
void CCoolControlsManager::Install( HWND hWnd )
{
CCMControl* pCtl;
if ( m_dlgMap.Lookup( hWnd, (void*&)pCtl ) ) // Already in the dialog map
return;
// Iterate through all child windows
HWND hCtrl = GetTopWindow( hWnd );
while ( hCtrl )
{
if ( GetWindowLong( hCtrl, GWL_STYLE ) & WS_CHILD )
{
TCHAR szBuf[MAX_CLASSNAME];
GetClassName( hCtrl, szBuf, MAX_CLASSNAME );
if ( lstrcmpi( szBuf, _T( "#32770" ) ) ) // Never add child dialogs!
AddControl( hCtrl );
}
hCtrl = GetNextWindow( hCtrl
没有合适的资源?快使用搜索试试~ 我知道了~
Visual C++项目开发案例精粹-光盘源码(11-20)
共2000个文件
h:951个
cpp:879个
bmp:150个
5星 · 超过95%的资源 需积分: 9 47 下载量 113 浏览量
2017-08-26
18:32:12
上传
评论 1
收藏 36.09MB RAR 举报
温馨提示
Visual C++项目开发案例精粹-光盘源码(11-20)
资源推荐
资源详情
资源评论
收起资源包目录
Visual C++项目开发案例精粹-光盘源码(11-20) (2000个子文件)
HotelManage.aps 2.71MB
ClinicManage.aps 1.45MB
ClinicManage.aps 1.45MB
ClinicManage.aps 1.45MB
HumanResourceSys.aps 1.34MB
HumanResourceSys.aps 1.34MB
HumanResourceSys.aps 1.34MB
project.aps 896KB
project.aps 896KB
project.aps 896KB
Course.aps 276KB
Course.aps 275KB
Course.aps 275KB
Rent.aps 150KB
Rent.aps 150KB
Rent.aps 150KB
FamilialFinaceManage.aps 131KB
FamilialFinaceManage.aps 131KB
FamilialFinaceManage.aps 131KB
DormManage.aps 54KB
DormManage.aps 54KB
DormManage.aps 54KB
GarageManage.aps 45KB
GarageManage.aps 45KB
GarageManage.aps 45KB
DriverManage.aps 35KB
DriverManage.aps 35KB
DriverManage.aps 35KB
hospital.bmp 1.37MB
hospital.bmp 1.37MB
hospital.bmp 1.37MB
bg.bmp 1.2MB
bg.bmp 1.2MB
bg.bmp 1.2MB
45.bmp 791KB
45.bmp 791KB
45.bmp 791KB
飞鹰.bmp 778KB
飞鹰.bmp 778KB
飞鹰.bmp 778KB
背景0.bmp 592KB
背景0.bmp 592KB
背景0.bmp 592KB
welcome2.bmp 308KB
Welcome.bmp 308KB
bitmap1.bmp 308KB
welcome2.bmp 308KB
Welcome.bmp 308KB
bitmap1.bmp 308KB
welcome2.bmp 308KB
Welcome.bmp 308KB
bitmap1.bmp 308KB
ViewBkgrd.bmp 244KB
ViewBkgrd.bmp 244KB
ViewBkgrd.bmp 244KB
酒店管理系统.bmp 220KB
酒店管理系统.bmp 220KB
酒店管理系统.bmp 220KB
酒店框架图.bmp 206KB
酒店框架图.bmp 206KB
酒店框架图.bmp 206KB
文本背景.bmp 162KB
文本背景.bmp 162KB
文本背景.bmp 162KB
logo.bmp 120KB
logo.bmp 120KB
logo.bmp 120KB
logo.bmp 103KB
logo.bmp 103KB
logo.bmp 103KB
0003.bmp 70KB
0003.bmp 70KB
0003.bmp 70KB
logo2.bmp 61KB
logo1.bmp 61KB
logo3.bmp 61KB
logo4.bmp 61KB
logo2.bmp 61KB
logo1.bmp 61KB
logo3.bmp 61KB
logo4.bmp 61KB
logo2.bmp 61KB
logo1.bmp 61KB
logo3.bmp 61KB
logo4.bmp 61KB
toolbar1.bmp 42KB
toolbar1.bmp 42KB
toolbar1.bmp 42KB
gradient.bmp 39KB
gradient.bmp 39KB
gradient.bmp 39KB
BKbmp.bmp 29KB
BKbmp.bmp 29KB
BKbmp.bmp 29KB
TureIcon.bmp 21KB
TureIcon.bmp 21KB
TureIcon.bmp 21KB
logobar3.bmp 10KB
logobar3.bmp 10KB
logobar3.bmp 10KB
共 2000 条
- 1
- 2
- 3
- 4
- 5
- 6
- 20
资源评论
- lordcat2020-10-22完整,后10章。我把20章全部压了个7zip包上传了,不知道能不能通过审核。
ahckzhu
- 粉丝: 2
- 资源: 9
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 正点原子开拓者FPGA多人表决器代码项目
- EOP-Last5Years.txt
- windows 32位、64位系统常见缺少的库
- 毕业设计基于springboot+vue实现的求职招聘类型网站源码+数据库(高分项目).zip
- 535springboot + vue 体质测试数据分析及可视化设计.zip(可运行源码+数据库文件+文档)
- python毕业设计-基于Django+OpenCV的二维码生成与识别系统源码.zip
- 基于springboot+vue实现的求职招聘类型网站源代码+数据库(优质毕设项目).zip
- iOS APP提审checklist
- 第十四届中北大学ACM程序设计竞赛.zip
- UIGF_200852355_202404242026.json
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功