【转】有关句柄和指针的常用函数

1. 如何获取应用程序的 实例句柄? AfxGetInstanceHandle()
     应用程序的 实例句柄保存在CWinAppIm_hInstance 中,可以这么调用 AfxGetInstancdHandle获得句柄.
       Example: HANDLE hInstance=AfxGetInstanceHandle();

2. 如何通过代码获得应用程序主窗口的 指针? AfxGetMainWnd   GetSafeHwnd() AfxGetAppName()   AfxGetThread
    主窗口的 指针保存在CWinThread::m_pMainWnd中,调用 AfxGetMainWnd实现。

   【例】    AfxGetMainWnd() ->ShowWindow(SW_SHOWMAXMIZED); //使程序最大化.

   【例】此例的主窗口是对话框,下面的代码是在另外一个CFileTreeCtrl 类(子窗)中相关函数实现在主对话框(主窗)中的几个 静态文本框(子窗)中显示路径:
             CWnd* m_pCWnd= AfxGetMainWnd(); //得到主窗口指针,通过主窗指针访问其他子窗资源
             //方法一
             m_pCWnd->SetDlgItemText(IDC_STATIC_path,"CWnd* "+m_sCurPath); //在主窗中的子窗(ID:IDC_STATIC_path)中显示字符串
             m_pCWnd->SetDlgItemText(IDC_STATIC_who,"路径显示由FileTreeCtrl类完成:");
             //方法二
             m_pCWnd->SendMessage(STN_CLICKED); //向主窗口发送一个消息,显示任务由主窗完成。
                                                //在主窗的.cpp中有:ON_MESSAGE(STN_CLICKED, OnSTATICpath3)相关描述

            //有的函数必须通过窗口的 句柄 来访问,我们可以使用下面的方法三
            //CWnd::GetSafeHwnd
            //Returns the window handle for a window
            //HWND GetSafeHwnd( ) const;
            HWND m_hWnd_tree =GetSafeHwnd();//【注】此处得到的只是当前窗口(FileTree类)的句柄
            HWND m_hWnd = m_pCWnd->GetSafeHwnd();// 这里才是主窗口的句柄(由主窗指针得到主窗的句柄)

            //BOOL SetWindowText( HWND hWnd, LPCTSTR lpString )
            ::SetWindowText(m_hWnd,"ok2222");//修改主窗口标题
            ::SetDlgItemText(m_hWnd,IDC_STATIC_path2,"HWND: "+m_sCurPath);

   【另】AfxGetThread
       CWinThread* AfxGetThread( );
       Return Value:Pointer to the currently executing thread.

3. 如何在程序中获得其他程序的 图标? AfxGetInstanceHandle()

   HINSTANCE AfxGetInstanceHandle( );
    Return Value
      An HINSTANCE to the current instance of the application. If called from within a DLL linked with the USRDLL version of MFC, an HINSTANCE to the DLL is returned.
    Remarks
      This function allows you to retrieve the instance handle of the current application. AfxGetInstanceHandle always returns the HINSTANCE of your executable file (.EXE) unless it is called from within a DLL linked with the USRDLL version of MFC. In this case, it returns an HINSTANCE to the DLL.

      两种方法:
         (1) SDK函数 SHGetFileInfo 或使用 ExtractIcon获得图标资源的 handle(句柄),
         (2) SDK函数 SHGetFileInfo获得有关文件的 很多信息,如大小图标,属性,类型等.

           Example(1): 在程序窗口左上角显示 NotePad图标.
            void CSampleView: OnDraw(CDC * pDC)
              {
                 if( :: SHGetFileInfo(_T("c://pwin95//notepad.exe"),0,
                      &stFileInfo,sizeof(stFileInfo),SHGFI_ICON))
                    {
                      pDC ->DrawIcon(10,10,stFileInfo.hIcon);
                    }
               }

                                                                           
          Example(2):同样功能,Use ExtractIcon Function
           void CSampleView:: OnDraw(CDC *pDC)
               {
                 HICON hIcon=:: ExtractIcon(AfxGetInstanceHandle(),_T
                  ("NotePad.exe"),0);

                 if (hIcon &&hIcon!=(HICON)-1)
                    pDC->DrawIcon(10,10,hIcon);
               }
    【说明】关于如何得到系统文件的正确路径,象win.ini system32.ini等的路径,各种系统中具体的路径是不一样的。如:
            获得notepad.exe的路径正规上来说用GetWindowsDirectory 函数得到;
            如果是调用 win95下的画笔,应该用访问注册表的方法获得其路径;
            要作成一个比较考究的程序,考虑应该全面点.

    【另】
                 HINSTANCE AfxGetResourceHandle( );
                 Return Value:An HINSTANCE handle where the default resources of the application are loaded.

4.    有关取得桌面句柄 GetDesktopWindow()

MSDN中的例子:

// 静态函数CWnd:: GetDesktopWindow 返回桌面窗口的指针。下例说明了MFC
void CFrameWnd::BeginModalState ()
{
   //first count all windows that need to be disabled
   UINT nCount=0;
   HWND hWnd=:: GetWindow (:: GetDesktopWindow (), GW_CHILD);
   while (hWnd!=NULL)
   {
     if (:: IsWindowEnabled (hwnd) &&
         CWnd::FromHandlePermanent (hWnd)!=NULL &&
         AfxIsDescendant (pParent->m_hWnd, hWnd) &&
         :: SendMessage (hWnd, WM_DISABLEMODAL, 0, 0) == 0)
     {
        ++nCount;
     }
     hWnd=:: GetWindow (hWnd, GW_HWNDNEXT);
   }
}

//用户的问题:下面程序取的不是同一程序的句柄,但是GetModuleFileName返回的结果一样请问为什莫

HWND ChWnd;//子窗口句柄
HWND hwDesktop=::GetDesktopWindow();//取得桌面句柄
ChWnd=::GetWindow(hwDesktop,GW_CHILD);//取得桌面子句柄
CString csTitle,csClass,csTm,mLookstring;
char szBuffer[255];
while(ChWnd!=NULL)//循环取子句柄的同级句柄
{
     if(::IsWindowVisible(ChWnd))//判断是否为可显示窗口
     {
          ::GetWindowText(ChWnd,csTitle.GetBuffer(255),254);
          ::GetClassName(ChWnd,csClass.GetBuffer(255),254);
          csTitle.ReleaseBuffer();//标题
          csClass.ReleaseBuffer();//类名
          csTm.Format("%08X:",ChWnd);
          if(csTitle=="")
          {
                mLookstring=csTm+csClass;
          }else
          {
                mLookstring=csTm+csTitle;
          }
          //这里的窗口句柄不是同一个程序吧?(问题所在!)可是为什莫结果一样
          HINSTANCE hInstance = (HINSTANCE)::GetWindowLong(ChWnd,DWL_USER);
          ::GetModuleFileName(hInstance, szBuffer, sizeof(szBuffer));
          MessageBox(szBuffer,mLookstring);
     }
     ChWnd=::GetWindow(ChWnd,GW_HWNDNEXT);
}

回答:

问题在于Win32下GetWindowLong(ChWnd,DWL_USER)总是返回当前程序运行的hInstance,所以你得到的文件名总是一个。所以你要用枚举所有"进程的程序名"来获得程序名。
 

=== 再谈句柄于指针的区别

许多开始学习VC的朋友,最多听说的两个词莫过于指针和句柄了。
但是,确经常搞不清他们之间的区别。
首先,句柄是一个窗口的标志,也就是所有从CWND类继承下来的,多有句柄这个成员。
他能做的,也就是唯一代表一个桌面上的窗口罢了。而指针是一个地址,如果它指向了一个内存中的对象,那么就可以对它进行任意操作了,当然,并不局限于自己的应用程序,你如果能够获得别的应用程序的某个对象的指针,也可以进行操作。然而,如果要获得指针,首先,必须找到那个窗口的句柄,然后用函数FromHandle就可以得到他的指针了。

 

===========================

如何在自定义的消息中发送一个字符串?例如:
SendMessage(MyWnd,WM_USERDEFINED, 0,0)
如何将字符串Buffer写入wParam或lParam?

你可以把字符串的地址传递过去,因为地址正好是32位。如:
char s[256];
SendMessage(MyWnd,WM_USERDEFINED, (WPARAM) s,0)
接收方只需要将wParam赋给一个char*就可以了。但此方法只能使用于在一个进程内部传递数据。

**项目名称:** 基于Vue.js与Spring Cloud架构的博客系统设计与开发——微服务分布式应用实践 **项目概述:** 本项目为计算机科学与技术专业本科毕业设计成果,旨在设计并实现一个采用前后端分离架构的现代化博客平台。系统前端基于Vue.js框架构建,提供响应式用户界面;后端采用Spring Cloud微服务架构,通过服务拆分、注册发现、配置中心及网关路由等技术,构建高可用、易扩展的分布式应用体系。项目重点探讨微服务模式下的系统设计、服务治理、数据一致性及部署运维等关键问题,体现了分布式系统在Web应用中的实践价值。 **技术架构:** 1. **前端技术栈:** Vue.js 2.x、Vue Router、Vuex、Element UI、Axios 2. **后端技术栈:** Spring Boot 2.x、Spring Cloud (Eureka/Nacos、Feign/OpenFeign、Ribbon、Hystrix、Zuul/Gateway、Config) 3. **数据存储:** MySQL 8.0(主数据存储)、Redis(缓存与会话管理) 4. **服务通信:** RESTful API、消息队列(可选RabbitMQ/Kafka) 5. **部署与运维:** Docker容器化、Jenkins持续集成、Nginx负载均衡 **核心功能模块:** - 用户管理:注册登录、权限控制、个人中心 - 文章管理:富文本编辑、分类标签、发布审核、评论互动 - 内容展示:首页推荐、分类检索、全文搜索、热门排行 - 系统管理:后台仪表盘、用户与内容监控、日志审计 - 微服务治理:服务健康检测、动态配置更新、熔断降级策略 **设计特点:** 1. **架构解耦:** 前后端完全分离,通过API网关统一接入,支持独立开发与部署。 2. **服务拆分:** 按业务域划分为用户服务、文章服务、评论服务、文件服务等独立微服务。 3. **高可用设计:** 采用服务注册发现机制,配合负载均衡与熔断器,提升系统容错能力。 4. **可扩展性:** 模块化设计支持横向扩展,配置中心实现运行时动态调整。 **项目成果:** 完成了一个具备完整博客功能、具备微服务典型特征的分布式系统原型,通过容器化部署验证了多服务协同运行的可行性,为云原生应用开发提供了实践参考。 资源来源于网络分享,仅用于学习交流使用,请勿用于商业,如有侵权请联系我删除!
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值