- 浏览: 12947 次
最新评论
【转】有关句柄和指针的常用函数
2010年11月11日
1. 如何获取应用程序的 实例句柄? AfxGetInstanceHandle() 应用程序的 实例句柄保存在CWinAppIm_hInstance 中,可以这么调用 AfxGetInstancdHandle获得句柄.[b] Example: HANDLE hInstance=AfxGetInstanceHandle();
2. 如何通过代码获得应用程序主窗口的 指针? AfxGetMainWnd GetSafeHwnd() AfxGetAppName() AfxGetThread[b] 主窗口的 指针保存在CWinThread::m_pMainWnd中,调用 AfxGetMainWnd实现。
【例】 AfxGetMainWnd() ->ShowWindow(SW_SHOWMAXMIZED); //使程序最大化.
【例】此例的主窗口是对话框,下面的代码是在另外一个CFileTreeCtrl 类(子窗)中相关函数实现在主对话框(主窗)中的几个 静态文本框(子窗)中显示路径:[b] CWnd* m_pCWnd= AfxGetMainWnd(); //得到主窗口指针,通过主窗指针访问其他子窗资源[b] //方法一[b] m_pCWnd->SetDlgItemText(IDC_STATIC_path,"CWnd* "+m_sCurPath); //在主窗中的子窗(ID:IDC_STATIC_path)中显示字符串[b] m_pCWnd->SetDlgItemText(IDC_STATIC_who,"路径显示由FileTreeCtrl类完成:");[b] //方法二[b] m_pCWnd->SendMessage(STN_CLICKED); //向主窗口发送一个消息,显示任务由主窗完成。[b] //在主窗的.cpp中有:ON_MESSAGE(STN_CLICKED, OnSTATICpath3)相关描述
//有的函数必须通过窗口的 句柄 来访问,我们可以使用下面的方法三[b] //CWnd::GetSafeHwnd [b] //Returns the window handle for a window[b] //HWND GetSafeHwnd( ) const;[b] HWND m_hWnd_tree =GetSafeHwnd();//【注】此处得到的只是当前窗口(FileTree类)的句柄[b] HWND m_hWnd = m_pCWnd->GetSafeHwnd();// 这里才是主窗口的句柄(由主窗指针得到主窗的句柄)
//BOOL SetWindowText( HWND hWnd, LPCTSTR lpString )[b] ::SetWindowText(m_hWnd,"ok2222");//修改主窗口标题[b] ::SetDlgItemText(m_hWnd,IDC_STATIC_path2,"HWND: "+m_sCurPath);
【另】AfxGetThread[b] CWinThread* AfxGetThread( );[b] Return Value:Pointer to the currently executing thread.
3. 如何在程序中获得其他程序的 图标? AfxGetInstanceHandle()
HINSTANCE AfxGetInstanceHandle( );[b] Return Value[b] 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.[b] Remarks[b] 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.
两种方法:[b] (1) SDK函数 SHGetFileInfo 或使用 ExtractIcon获得图标资源的 handle(句柄),[b] (2) SDK函数 SHGetFileInfo获得有关文件的 很多信息,如大小图标,属性,类型等.
Example(1): 在程序窗口左上角显示 NotePad图标.[b] void CSampleView: OnDraw(CDC * pDC)[b] {[b] if( :: SHGetFileInfo(_T("c:\\pwin95\\notepad.exe"),0,[b] &stFileInfo,sizeof(stFileInfo),SHGFI_ICON))[b] {[b] pDC ->DrawIcon(10,10,stFileInfo.hIcon);[b] }[b] }
[b] Example(2):同样功能,Use ExtractIcon Function[b] void CSampleView:: OnDraw(CDC *pDC)[b] {[b] HICON hIcon=:: ExtractIcon(AfxGetInstanceHandle(),_T[b] ("NotePad.exe"),0);
if (hIcon &&hIcon!=(HICON)-1)[b] pDC->DrawIcon(10,10,hIcon);[b] }[b] 【说明】关于如何得到系统文件的正确路径,象win.ini system32.ini等的路径,各种系统中具体的路径是不一样的。如:[b] 获得notepad.exe的路径正规上来说用GetWindowsDirectory 函数得到;[b] 如果是调用 win95下的画笔,应该用访问注册表的方法获得其路径;[b] 要作成一个比较考究的程序,考虑应该全面点.
【另】[b] HINSTANCE AfxGetResourceHandle( );[b] Return Value:An HINSTANCE handle where the default resources of the application are loaded.
4. 有关取得桌面句柄 GetDesktopWindow()
MSDN中的例子:
// 静态函数CWnd:: GetDesktopWindow 返回桌面窗口的指针。下例说明了MFC[b]void CFrameWnd::BeginModalState ()[b]{[b] //first count all windows that need to be disabled[b] UINT nCount=0;[b] HWND hWnd=:: GetWindow (:: GetDesktopWindow (), GW_CHILD);[b] while (hWnd!=NULL)[b] {[b] if (:: IsWindowEnabled (hwnd) &&[b] CWnd::FromHandlePermanent (hWnd)!=NULL &&[b] AfxIsDescendant (pParent->m_hWnd, hWnd) &&[b] :: SendMessage (hWnd, WM_DISABLEMODAL, 0, 0) == 0)[b] {[b] ++nCount;[b] }[b] hWnd=:: GetWindow (hWnd, GW_HWNDNEXT);[b] }[b]}
//用户的问题:下面程序取的不是同一程序的句柄,但是GetModuleFileName返回的结果一样请问为什莫
HWND ChWnd;//子窗口句柄 [b]HWND hwDesktop=::GetDesktopWindow();//取得桌面句柄 [b]ChWnd=::GetWindow(hwDesktop,GW_CHILD);//取得桌面子句柄 [b]CString csTitle,csClass,csTm,mLookstring; [b]char szBuffer[255]; [b]while(ChWnd!=NULL)//循环取子句柄的同级句柄 [b]{ [b] if(::IsWindowVisible(ChWnd))//判断是否为可显示窗口 [b] { [b] ::GetWindowText(ChWnd,csTitle.GetBuffer(255),254); [b] ::GetClassName(ChWnd,csClass.GetBuffer(255),254); [b] csTitle.ReleaseBuffer();//标题 [b] csClass.ReleaseBuffer();//类名 [b] csTm.Format("%08X:",ChWnd); [b] if(csTitle=="") [b] { [b] mLookstring=csTm+csClass; [b] }else [b] { [b] mLookstring=csTm+csTitle; [b] } [b] //这里的窗口句柄不是同一个程序吧?(问题所在!)可是为什莫结果一样 [b] HINSTANCE hInstance = (HINSTANCE)::GetWindowLong(ChWnd,DWL_USER); [b] ::GetModuleFileName(hInstance, szBuffer, sizeof(szBuffer)); [b] MessageBox(szBuffer,mLookstring); [b] } [b] ChWnd=::GetWindow(ChWnd,GW_HWNDNEXT); [b]}
回答:
问题在于Win32下GetWindowLong(ChWnd,DWL_USER)总是返回当前程序运行的hInstance,所以你得到的文件名总是一个。所以你要用枚举所有"进程的程序名"来获得程序名。 [b]
=== 再谈句柄于指针的区别
许多开始学习VC的朋友,最多听说的两个词莫过于指针和句柄了。 [b]但是,确经常搞不清他们之间的区别。 [b]首先,句柄是一个窗口的标志,也就是所有从CWND类继承下来的,多有句柄这个成员。 [b]他能做的,也就是唯一代表一个桌面上的窗口罢了。而指针是一个地址,如果它指向了一个内存中的对象,那么就可以对它进行任意操作了,当然,并不局限于自己的应用程序,你如果能够获得别的应用程序的某个对象的指针,也可以进行操作。然而,如果要获得指针,首先,必须找到那个窗口的句柄,然后用函数FromHandle就可以得到他的指针了。
=== 问题1:
如何在自定义的消息中发送一个字符串?例如: [b]SendMessage(MyWnd,WM_USERDEFINED, 0,0) [b]如何将字符串Buffer写入wParam或lParam?
你可以把字符串的地址传递过去,因为地址正好是32位。如: [b]char s[256]; [b]SendMessage(MyWnd,WM_USERDEFINED, (WPARAM) s,0) [b]接收方只需要将wParam赋给一个char*就可以了。但此方法只能使用于在一个进程内部传递数据。 [b]
=== 问题2: [b]1.在VC应用程序框架中,如何加入自己做的类,如何定义这个类的对象,我想在鼠标点击某个菜单项的时候才生成这个对象,做得到吗?(这个类的构造函数是带参数的)。 [b]2.消息发送函数: [b] PostMessage(HWND handle,WM_MYMESSAGE, [b] WPARAM wParam,LPARAM lParam) [b] 中: [b]第一个参数如何获得?[b]如果我的消息是在自己的应用程序中生成的,想发给应用程序的窗口让它显示某些数据(用TextOut函数),能做到吗?[b](也可以说是这样的问题:用Appwizard生成应用程序框架,在生成的类(如CView)中如何得到窗口的句柄,并放在PostMessage函数中。) [b]3.wParam,lParam,在消息响应函数中如何用?vc是怎样保证这两个数传到函数中的?问题比较多,谢谢! [b]水平: 刚入门
回答:
1、这个问题是肯定的。你可以使用ClassWizard定义类,也可以手工输入。如果类定义已经在某个文件中,只要使用Project|Add files将文件加入工程就可以了。要想定义类的对象,只要在你的菜单项的相应事件中就可以了。如: [b]{ [b]... [b]MyClass myObject("Hello"); [b]myObject.MyMethod(); [b]... [b]} [b]2、在你自己的程序中传递消息当然没有任何问题,只要你知道要调用的窗口类是从CWnd继承来的,你就可以使用GetSafeHwnd函数获得窗口句柄。不过一般在自己的同一个程序中有时不愿意使用自定义消息,因为太麻烦。你完全可以给要调用的类添加一个成员函数,只要想显示数据,直接调用这个成员函数不就可以了?何必使用PostMessage呢?一般只有在程序间调用,才愿意使用自定义消息。这时,你通常可以使用FindWindow获得窗口句柄(QA000251 "如何利用FindWindow()函数查找程序")。 [b]3、对于MFC已经定义了消息处理函数的消息,MFC会自动把wParam和lParam映射为更容易使用的方式。如OnMouseMove( UINT nFlags, CPoint point )。对于MFC不能自动处理的函数,如你使用ON_MESSAGE定义消息函数,则MFC会把wParam和lParam原原本本的传递给你的函数,不做任何处理。
=== 一个未公开的Win32 API函数:GetTaskmanWindow ()
下例中还用到: GetProcAddress GetParent(hWnd)[b] HMODULE hUser32 = GetModuleHandle("user32");
download
// getaskmanwnd.cpp (Windows NT/2000)[b]//[b]// 利用一个未公开的Win32 API函数:GetTaskmanWindow,[b]// 对Windows的任务栏进行操作(显示/隐藏)。这个函数返回拥有任务栏按钮的窗口句柄。[b]//[b]// This example will show you how you can obtain a handle to the[b]// Windows Taskbar window.[b]//[b]// (c)1999 Ashot Oganesyan K, SmartLine, Inc[b]// [ft=#249ede,,, http://www.protect-me.com, http://www.codepile.com
#i nclude [b]#i nclude
[b]// User32!GetTaskmanWindow (NT specific!)[b]//[b]// This function returns a handle to the window that ownes the taskbar buttons[b]//[b]// HWND GetTaskmanWindow()[b]//[b]typedef HWND (WINAPI *PROCGETTASKMANWND)(void);
[b]PROCGETTASKMANWND GetTaskmanWindow;
[b]void main(int argc, char* argv[])[b]{[b]if (argc<2)[b]{[b]printf("Usage:\n\ngetaskmanwnd.exe S|H\n");[b]return;[b]}
HMODULE hUser32 = GetModuleHandle("user32");[b]if (!hUser32)[b]return;
GetTaskmanWindow = (PROCGETTASKMANWND)GetProcAddress(hUser32,"GetTaskmanWindow"); [b]if (!GetTaskmanWindow)[b]return;
HWND hWnd = GetTaskmanWindow();
if (!hWnd)[b]return;
if (*argv[1]=="H" || *argv[1]=="h")[b]ShowWindow(GetParent(hWnd),SW_HIDE);[b]else[b]ShowWindow(GetParent(hWnd),SW_SHOW);
}
[/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b]
发表评论
-
批量修改多个文件内容的脚本
2012-01-20 01:33 784批量修改多个文件内容的脚本 2010年07月30日 如果 ... -
PowerShell 2.0之使用WMI管理Windows(二)PowerShell操作WMI
2012-01-20 01:33 854PowerShell 2.0之使用WMI管理Windows(二 ... -
IIS 服务器没有及时响应启动或控制请求 未启动 启动 world wide web publishing服务 127 找不到指定程序
2012-01-20 01:33 1087IIS 服务器没有及时响应启动或控制请求 未启动 启动 wor ... -
vbs脚本:DeleteFolder
2012-01-20 01:33 751vbs脚本:DeleteFolder 2010年08月08日 ... -
QTP使用技巧(1)
2012-01-20 01:33 564QTP使用技巧(1) 2011年06 ... -
屎上最难!最搞笑的脑筋急转弯!不看答案你能猜对几个?
2012-01-19 09:23 592屎上最难!最搞笑的脑筋急转弯!不看答案你能猜对几个? 201 ... -
[转] Win7 配置Android开发环境
2012-01-17 01:58 615[转] Win7 配置Android开发环境 2011年08 ... -
解决Ubuntu中使用windows文件名乱码问题
2012-01-17 01:58 1226解决Ubuntu中使用windows文 ... -
Eclipse ---RCP总结
2012-01-17 01:58 811Eclipse ---RCP总结 2010年10月24日 ... -
文本朗读器的设计与制作
2012-01-17 01:58 931文本朗读器的设计与制作 2010年07月29日 文本朗读 ... -
linux C库函数(二)
2012-01-15 21:14 734linux C库函数(二) 2010年01月26日 li ... -
linux C库函数(三)
2012-01-15 21:14 578linux C库函数(三) 2010年0 ... -
meego开发的学习路线
2012-01-15 21:14 467meego开发的学习路线 2011年06月26日 不同版 ... -
memmem 函数
2012-01-15 21:14 1287memmem 函数 2011年06月02日 软件研发的面 ... -
文件读写函数的使用方法
2012-01-15 21:14 612文件读写函数的使用方法 2010年04月11日 原文地址 ...
相关推荐
MFC中 各类的指针和句柄的获取方法,各种API函数的使用
该函数获得一个窗口的句柄,该窗口的类名和窗口名与给定的字符串相匹配。这个函数查找子窗口,从排在给定的子窗口后面的下一个子窗口开始。在查找时不区分大小写。 参数; (1)hwndParent:要查找的子窗口所在的父...
1、用FindWindow("类名(可以是派生类)","窗口标题")或GetParent(),二者均能返回父窗口句柄,并能直接使用其成员函数。但是此法只能调用CWnd类里的成员函数,而不能调用自己创建的派生类中的函数。 2、在子窗口的...
◆将一个CWnd指针转换成一个控件ID(整数)注意用GetDlgItem()函数是从一个控件ID转换成一个CWnd的指针◆ 28 ◆如果在对话框中自定义一个消息的方法,假设对话框名为CXX◆ 28 ◆消息传递◆ 29 ◆在一个函数引用另外的...
FindClose 关闭由FindFirstFile函数创建的一个搜索句柄 FindFirstFile 根据文件名查找文件 FindNextFile 根据调用FindFirstFile函数时指定的一个文件名查找下一个文件 FlushFileBuffers 针对指定的文件句柄,刷新...
易语言根据图像取句柄源码例程程序调用API函数取图像句柄。点评:易语言根据图像取句柄源码支持图标、光标、图片等。一般用于置托盘图标、设置鼠标指针、光标图片、GDI绘图、位图操作等。
∷相关函数:Parent函数 LeftChild函数 RightChild函数 LeftSibling函数 RightSibling函数 1.4.7 双亲、孩子和兄弟节点的查询(链式结构) 162 范例1-61 双亲、孩子和兄弟节点的查询 162 ∷相关函数:Parent函数 ...
∷相关函数:Parent函数 LeftChild函数 RightChild函数 LeftSibling函数 RightSibling函数 1.4.7 双亲、孩子和兄弟节点的查询(链式结构) 162 范例1-61 双亲、孩子和兄弟节点的查询 162 ∷相关函数:Parent函数 ...
∷相关函数:Parent函数 LeftChild函数 RightChild函数 LeftSibling函数 RightSibling函数 1.4.7 双亲、孩子和兄弟节点的查询(链式结构) 162 范例1-61 双亲、孩子和兄弟节点的查询 162 ∷相关函数:Parent函数 ...
FC常用类及其成员函数 CRuntimeClass结构 在CRuntimeClass结构中定义了类名、对象所占存储空间的大小、类的版本号等成员变量及动态创建对象、派生关系判断等成员函数。每一个从CObject类派生的类都有一个...
5.3.3 使用全局和局部函数分配和释放内存、改变内存块属性 137 5.4 虚拟内存管理 138 5.4.1 虚拟地址空间与内存分页 139 5.4.2 分配和释放可读可写的虚拟内存页面 139 5.4.3 修改内存页面状态和保护属性、...
5.3.3 使用全局和局部函数分配和释放内存、改变内存块属性 137 5.4 虚拟内存管理 138 5.4.1 虚拟地址空间与内存分页 139 5.4.2 分配和释放可读可写的虚拟内存页面 139 5.4.3 修改内存页面状态和保护属性、...
3.回调(CALLBACK):这其实是C语言中的函数指针,函数指针一般在大项目搭框架时 常常使用。也就是你设计好要得到什么,把接口定义好,具体怎么实现完全交给 别人,别人只要把函数名传给你就OK。这个函数名就是地址,...
函数PlaySound和sndPlaySound的用法(delphi) 一.PlaySound函数的声明为: BOOL PlaySound(LPCSTR pszSound,HMODULE hmod,DWORD fdwSound); 1.参数pszSound:是指定了要播放声音的字符串,该参数可以是WAVE文件的名字,...
15.4.5 构造函数和析构函数中的虚函数 497 15.5 继承情况下的类作用域 497 15.5.1 名字查找在编译时发生 498 15.5.2 名字冲突与继承 498 15.5.3 作用域与成员函数 499 15.5.4 虚函数与作用域 500 15.6 纯虚函数 502 ...
智能指针是c++ 中的一个概念,因为c++ 本身不具备垃圾回收机制,而且指针也不具备构造函数和析构函数,所以为了实现内存( 动态存储区) 的安全回收,必须对指针进行一层封装,而这个封装就是智能指针,其实说白了,...
vc常用数据及其转换,Win32API支持的简单数据类型主要是用来定义函数返回值,消息参数,结构成员。这类数据类型大致可以分为五大类:字符型、布尔型、整型、指针型和句柄型(?). 总共大概有100多种不同的类型……
可以以十六进制和十进制两种不同方式显示窗口句柄等所有数值。本软件还可以简单调节窗口的状态和形为,如是否可见,是否可用,最大化,激活等。除此以外,您还可以把它当作一个截图的小工具来用。:) 下面举两个...