当前位置: 首页 > news >正文

中国建设银行北京分行官网站网站底部模板代码

中国建设银行北京分行官网站,网站底部模板代码,wordpress做阿里巴巴国际站,雅联网站建设目录 钩子简介 代码编写 窗口创建过程分析 消息处理 钩子简介 介绍几个钩子函数#xff0c;因为它们与窗口创建工程有关 安装钩子函数 HHOOK SetWindowsHookExA([in] int idHook,[in] HOOKPROC lpfn,[in] HINSTANCE hmod,[in] DWORD dwThreadId ); 参数说明…目录 钩子简介 代码编写 窗口创建过程分析 消息处理 钩子简介 介绍几个钩子函数因为它们与窗口创建工程有关 安装钩子函数 HHOOK SetWindowsHookExA([in] int idHook,[in] HOOKPROC lpfn,[in] HINSTANCE hmod,[in] DWORD dwThreadId ); 参数说明 idHook指定要安装的钩子类型例如鼠标钩子、键盘钩子等。lpfn指向钩子过程HookProc的指针即要安装的钩子处理函数。hmod指定包含钩子过程的DLL模块句柄。如果是本地钩子或全局钩子则此参数可以为NULL。dwThreadId指定关联的线程ID。对于全局钩子如果此参数为0则表示将钩子应用到所有线程。 钩子处理函数 LRESULT CALLBACK CBTProc(_In_ int    nCode,_In_ WPARAM wParam,_In_ LPARAM lParam ); 参数说明 nCode指示钩子过程收到的通知代码用于确定如何处理钩子。wParam指定与钩子相关的消息的附加消息信息。lParam指定与钩子相关的消息的附加消息信息。 更改窗口处理函数 LONG_PTR SetWindowLongPtrA([in] HWND hWnd,[in] int nIndex,[in] LONG_PTR dwNewLong ); 参数说明 hWnd指定要设置额外窗口内存的窗口句柄。nIndex指定要设置的值的偏移量。可以是一个负偏移量也可以是预定义值之一。dwNewLong指定的一个32位或64位的新值取决于窗口的32位或64位。 代码编写 还是创建一个空白的Winodws应用程序 修改为多字节编码使用静态MFC库方便调试 #include afxwin.hclass CMyFrameWnd : public CFrameWnd { public:virtual LRESULT WindowProc(UINT msgID, WPARAM wParam, LPARAM); }; LRESULT CMyFrameWnd::WindowProc(UINT msgID, WPARAM wParam, LPARAM lParam) {//此函数内部的this为pFrameswitch (msgID) {case WM_CREATE:AfxMessageBox(WM_CREATE消息被处理);break;case WM_PAINT:{PAINTSTRUCT ps { 0 };HDC hdc ::BeginPaint(this-m_hWnd, ps);::TextOut(hdc, 100, 100, hello, 5);::EndPaint(m_hWnd, ps);}break;}return CFrameWnd::WindowProc(msgID, wParam, lParam); } class CMyWinApp : public CWinApp { public:virtual BOOL InitInstance(); };CMyWinApp theApp;//爆破点BOOL CMyWinApp::InitInstance() {CMyFrameWnd* pFrame new CMyFrameWnd;pFrame-Create(NULL, MFCCreate);m_pMainWnd pFrame;pFrame-ShowWindow(SW_SHOW);pFrame-UpdateWindow();return TRUE; }遇见报错是程序类型的问题 窗口创建过程分析 加载菜单调用cWnd::CreateEx函数创建窗口 调用PreCreateWindow函数设计和注册窗口类调用AfxDeferRegisterClass函数在这个函数中设计窗口类∶ WNDCLASS wndcls;//设计窗口类定义窗口的处理函数为DefWindowProcwndcls.lpfnWndProc DefWindowProc;调用_AfxRegisterWithlcon函数在函数内部加载图标并调用AfxRegisterClass函数在函数内部调用::RegisterClass win32 ApI函数注册窗口类调用AfxHookWindowCreate 函数。在函数内部调用SetWindowsHookEx创建WH_CBT类型的钩子钩子的处理函数是_AfxCbtFilterHook。 将框架类对象地址(pFrame)保存到当前程序线程信息中调用CreateWindowEx函数创建窗口马上调用钩子处理函数钩子处理函数_AfxCbtFilterHook将窗口句柄和框架类对象地址建立一对一的绑定关系。使用SetWindowLong函数将窗口处理的函数设置AfxWndProc 下断点分析 Create() 函数F11进入分析 第一个参数为 NULL第二个参数是一个字符串 MFCCreate进入 Create 函数内部 前面是针对 第一个参数不为空的处理 if (lpszMenuName ! NULL){// load in a menu that will get destroyed when window gets destroyedHINSTANCE hInst AfxFindResourceHandle(lpszMenuName, ATL_RT_MENU);if ((hMenu ::LoadMenu(hInst, lpszMenuName)) NULL){TRACE(traceAppMsg, 0, Warning: failed to load menu for CFrameWnd.\n);PostNcDestroy(); // perhaps delete the C objectreturn FALSE;}} 参数为空的处理 进入CreateEx函数NULL 作为第二个参数 if (!CreateEx(dwExStyle, lpszClassName, lpszWindowName, dwStyle,rect.left, rect.top, rect.right - rect.left, rect.bottom - rect.top,pParentWnd-GetSafeHwnd(), hMenu, (LPVOID)pContext)) CREATESTRUCT结构体在窗口创建过程中提供了创建窗口所需的各种信息这个结构体会作为函数 CreateWindowEx 的参数创建窗口 CREATESTRUCT cs;cs.dwExStyle dwExStyle;cs.lpszClass lpszClassName;cs.lpszName lpszWindowName;cs.style dwStyle;cs.x x;cs.y y;cs.cx nWidth;cs.cy nHeight;cs.hwndParent hWndParent;cs.hMenu nIDorHMenu;cs.hInstance AfxGetInstanceHandle(); // 获取当前程序实例句柄cs.lpCreateParams lpParam; 进入PreCtreateWinodow函数创建窗口之前的处理函数 if (!PreCreateWindow(cs)){PostNcDestroy();return FALSE;} 再进入AfxEndDeferRegisterClass函数AfxGetModuleState() 是类库的全局函数为全局变量 当前程序模块信息类 服务 通过定义WNDCLASS结构体并填充相应成员的值开发人员可以注册一个新的窗口类并使用该类创建窗口。可以通过 AfxGetInstanceHandle() 这个全局函数获取当前应用程序实例句柄。 WNDCLASS wndcls;memset(wndcls, 0, sizeof(WNDCLASS)); // start with NULL defaultswndcls.lpfnWndProc DefWindowProc; // 窗口处理函数wndcls.hInstance AfxGetInstanceHandle();wndcls.hCursor afxData.hcurArrow; 一直按F11程序执行流程走到这个函数中 if (fToRegister AFX_WNDFRAMEORVIEW_REG){// SDI Frame or MDI Child windows or views - normal colorswndcls.style CS_DBLCLKS | CS_HREDRAW | CS_VREDRAW;wndcls.hbrBackground (HBRUSH) (COLOR_WINDOW 1);if (_AfxRegisterWithIcon(wndcls, _afxWndFrameOrView, AFX_IDI_STD_FRAME))fRegisteredClasses | AFX_WNDFRAMEORVIEW_REG;} 进入函数 _AfxRegisterWithIcon(wndcls, _afxWndFrameOrView, AFX_IDI_STD_FRAME) 为窗口类 lpszClassName 赋值 之后调用  AfxRegisterClass(pWndCls)  ,这个函数就是注册窗口了之后没有必要再跟下去了 AFX_STATIC BOOL AFXAPI _AfxRegisterWithIcon(WNDCLASS* pWndCls,LPCTSTR lpszClassName, UINT nIDIcon) {pWndCls-lpszClassName lpszClassName;HINSTANCE hInst AfxFindResourceHandle(ATL_MAKEINTRESOURCE(nIDIcon), ATL_RT_GROUP_ICON);if ((pWndCls-hIcon ::LoadIconW(hInst, ATL_MAKEINTRESOURCEW(nIDIcon))) NULL){// use default iconpWndCls-hIcon ::LoadIcon(NULL, IDI_APPLICATION);}return AfxRegisterClass(pWndCls); } 完成了窗口注册程序流程一路返回 跟进到 AfxHookWindowCreate(this)  获取当前程序线程信息 _AFX_THREAD_STATE* pThreadState _afxThreadState.GetData(); 利用Win32的API函数埋下一个类型为WH_CBT的钩子钩子处理函数是 _AfxCbtFilterHook WH_CBT钩子是一种全局的系统事件钩子它允许拦截一系列与计算机、窗口、任务和其他系统相关的事件。这些事件包括窗口的创建、激活、移动、销毁等通过使用WH_CBT钩子应用程序可以介入并对这些系统事件做出响应或修改。 ::SetWindowsHookEx(WH_CBT,_AfxCbtFilterHook, NULL, ::GetCurrentThreadId()); 将自己new的框架类对象pFrame保存到pThreadState-m_pWndInit pThreadState-m_pWndInit pFrame; 之后开始创建窗口当窗口创建成功后钩子就会钩到WM_CREATE消息之后调用钩子处理函数函数第二个参数 wParam 是窗口句柄 _AFX_THREAD_STATE* pThreadState _afxThreadState.GetData(); // 程序线程信息 CWnd* pWndInit pThreadState-m_pWndInit; // 框架窗口对象赋值 之后调用attch 函数的this是框架窗口对象 pWndInit-Attach(hWnd); 进入到 afxMapHWND 函数 CHandleMap* pMap afxMapHWND(TRUE); 函数内部创建了一个CHandleMap返回给 CHandleMap* pMap pState-m_pmapHWND new CHandleMap(RUNTIME_CLASS(CWnd) 调用SetPermanent第一个参数是窗口句柄另一个是框架窗口对象 pMap-SetPermanent(m_hWnd hWndNew, this); m_permanentMap是一个数组根据下标窗口句柄就能拿到窗口框架对象也就是说建立了一个窗口句柄到框架窗口对象的映射 void CHandleMap::SetPermanent(HANDLE h, CObject* permOb) {BOOL bEnable AfxEnableMemoryTracking(FALSE);m_permanentMap[(LPVOID)h] permOb;AfxEnableMemoryTracking(bEnable); } 将窗口处理函数更改为AfxWndProc才是真正的窗口处理函数  oldWndProc (WNDPROC)SetWindowLongPtr(hWnd, GWLP_WNDPROC,(DWORD_PTR)afxWndProc); 接下来就是窗口处理函数来处理消息 消息处理 接下尝试调试WM_CREATE消息 当收到消息时进入AfxWndProc函数。AfxWndProc 函数根据消息的窗口句柄查询对应框架类对象的地址( pFrame ) 。利用框架类对象地址( pFrame)调用框架类成员虚函数WindowProc完成消息的处理。 重写虚函数消息处理函数 LRESULT CMyFrameWnd::WindowProc(UINT msgID, WPARAM wParam, LPARAM lParam) {//此函数内部的this为pFrameswitch (msgID) {case WM_CREATE:AfxMessageBox(WM_CREATE消息被处理);break;case WM_PAINT:{PAINTSTRUCT ps { 0 };HDC hdc ::BeginPaint(this-m_hWnd, ps);::TextOut(hdc, 100, 100, hello, 5);::EndPaint(m_hWnd, ps);}break;}return CFrameWnd::WindowProc(msgID, wParam, lParam); } 下个断点看看调用堆栈 在这里下个断点分析一下执行过程 CWnd* pWnd CWnd::FromHandlePermanent(hWnd); 进入FromHandlePermanent函数 CWnd* PASCAL CWnd::FromHandlePermanent(HWND hWnd) {CHandleMap* pMap afxMapHWND();CWnd* pWnd NULL;if (pMap ! NULL){// only look in the permanent map - does no allocationspWnd (CWnd*)pMap-LookupPermanent(hWnd);ASSERT(pWnd NULL || pWnd-m_hWnd hWnd);}return pWnd; } CHandleMap* pMap afxMapHWND(); 进入看看返回就是之前保存在程序模块线程信息中的映射类对象地址 根据窗口句柄拿到框架窗口句柄这之间关系就好比 洗衣机与洗衣机类通过类来管理句柄 通过这个函数进一步调用到重写的虚函数 return AfxCallWndProc(pWnd, hWnd, nMsg, wParam, lParam); lResult pWnd-WindowProc(nMsg, wParam, lParam);
http://www.zqtcl.cn/news/252816/

相关文章:

  • 电脑托管宁波seo排名外包
  • 外汇网站模版网站开发和网站制作的区别
  • 学习网站建设的书籍我要做个网站该怎么做
  • h5互动网站建设网站制作的教程
  • 大连网站设计公司双语外贸网站源码
  • 广元网站建设工作室湖北省建设用地预审网站
  • 保定清苑城市建设网站公司网站建立费用
  • 厦门找一家做网站的公司家在深圳论坛
  • 个人网站开发 服务器货源之家官网
  • 教育培训学校网站建设策划局域网 wordpress
  • 重庆建网站有哪些网站做曲线的源代码
  • 龙岩网站设计找哪家公司网站建设没有业务怎么办
  • 网站建设专业学什么建材 团购 网站怎么做
  • 电器工程东莞网站建设wordpress虚拟资源下载源码
  • 无限个网站虚拟空间网站运行维护
  • 宝思哲手表网站关于计算机网站建设的论文
  • uc投放广告网站要自己做吗dw制作企业网站
  • 山东网站制作南京软件外包公司
  • 铁岭建设银行网站网站验证码原理
  • 做网站需要什么专业方向的员工钱多网站
  • 网站建设合同要存档几年7星彩网站开发
  • 网站建设好后 如何验收什么网站可以做护考题
  • 网站安全怎么做wordpress代币插件
  • 吉林网站建设电话龙华网站建设专业定制企业
  • 个人导航网站怎么备案js调用wordpress文章列表
  • 网站微信推广方案衡水外贸网站建设
  • 怎么打造自己的网站如何做自已网站
  • 美容美发网站模板wordpress适合优化吗
  • 网站开发的著作权和版权沧州市做网站价格
  • 优客逸家网站源码酒吧装修