本文目录一览:
- 1、句柄是什么啊?
- 2、怎样获取mfc的窗口名,类名
- 3、MFC 单文档视图中,怎样可以让EnumWindows()显示的字体是红色
- 4、关于mfc中EnumWindows的回调函数的用法(如何在回调函数中调用类的成员函数或者成员变量)
- 5、MFC中,如何获取一个已知窗口标题的窗口的句柄
句柄是什么啊?
分类: 电脑/网络
解析:
一、书上定义:
Microsoft Windows 3 Developer''s Workshop(Microsoft Press,by Richard Wilton)
在Windows环境中,句柄是用来标识项目的,这些项目包括:模块(module)、任务(task)、实例 (instance)、文件(file)、内存块(block of memory)、菜单(menu)、控制(control)、字体(font)、资源(resource),包括图标(icon),光标 (cursor),字符串(string)等、GDI对象(GDI object),包括位图(bitmap),画刷(brush),元文件(metafile),调色板(palette),画笔(pen),区域 (region),以及设备描述表(device context)。 -mfcenumwindows
WINDOWS编程短平快(南京大学出版社):
句柄是WONDOWS用来标识被应用程序所建立或使用的对象的唯一整数,WINDOWS使用各种各样的句柄标识诸如应用程序实例,窗口,控制,位图,GDI对象等等。WINDOWS句柄有点象C语言中的文件句柄。 -mfcenumwindows
二、MFC源代码:
#ifdef STRICT
typedef void *HANDLE;
#define DECLARE_HANDLE(name) struct name##__ { int unused; }; typedef struct name##__ *name
#else
typedef PVOID HANDLE;
#define DECLARE_HANDLE(name) typedef HANDLE name
#endif
DECLARE_HANDLE(HMODULE);
DECLARE_HANDLE(HINSTANCE);
DECLARE_HANDLE(HLOCAL);
DECLARE_HANDLE(HGLOBAL);
DECLARE_HANDLE(HDC);
DECLARE_HANDLE(HRGN);
DECLARE_HANDLE(HWND);
DECLARE_HANDLE(HMENU);
DECLARE_HANDLE(HACCEL);
DECLARE_HANDLE(HTASK);
三、理解:
HANDLE就是PVOID,也就是无类型指针,
上面这些资源的句柄Handles都不过是指向struct的指针,至于这个struct的用处,连M$都说unused了,现在解释下M$这么做的意义,这就是所谓数据封装,你可以在你的程序中把M$的内部结构指针传来传去,可是你却不知道它到底指向的内容是什么。-mfcenumwindows
句柄与指针确实是完全不同的两个概念。句柄仅仅是一个32位整数,WIN32中用于标记某个系统或进程的对象,可以理解为对象索引(由于M$未完全公开相关技术,在一定程度上只能如此理解),这个索引更像是一种映射关系(从句柄到对象指针的映射),而不是纯粹意义上的“数组下标”。 -mfcenumwindows
句柄可以理解为用于指向或标识内存的一块“资源”,这些资源如:文件(file)、内存块(block of memory)、菜单(menu)等等。操作系统通过句柄来定位核心对象和系统资源。
指针即为指向内存的“数据或指令”某一单元。
说的确切一点,句柄实际上是一种指向某种资源的指针,但与指针又有所不同:指针对应着一个数据在内存中的地址,得到了指针就可以自由地修改该数据。Windows并不希望一般程序修改其内部数据结构,因为这样太不安全。所以Windows给每个使用GlobalAlloc等函数声明的内存区域指定一个句柄(本质上仍是一个指针,但不要直接操作它),平时你只是在调用API函数时利用这个句柄来说明要操作哪段内存。-mfcenumwindows
四、引喻:
牧童遥指杏花村
牧童的手为指针,杏花村的牌子为句柄,杏花村酒店为对象的实例.
附注:获得窗口句柄三种方法
1.HWND FindWindow(LPCTSTR lpClassName, LPCTSTR lpWindowName)
HWND FindWindowEx(HWND hwndParent, HWND hwndChildAfter,LPCTSTR lpClassName, LPCTSTR lpWindowName) -mfcenumwindows
2.HWND WindowFromPoint(POINT Point)//获得当前鼠标光标位置的窗口HWND
3.BOOL CALLBACK EnumChildProc(HWND hwnd,LPARAM lParam)
BOOL CALLBACK EnumChildWindows(HWND hWndParent, WNDENUMPROC lpEnumFunc,LPARAM lParam)
BOOL CALLBACK EnumWindows(WNDENUMPROC lpEnumFunc, LPARAM lParam)
BOOL CALLBACK EnumWindowsProc(HWND hwnd, LPARAM lParam)
怎样获取mfc的窗口名,类名
使用EnumWindows函数可以实现遍历所有的顶层窗口程序,并得到程序的句柄、类名及标题信息。
开发核心过程:创建一个单文档的MFC工程,将其视图类的基类设置为CListView。
在视图类的PreCreateWindow函数中,设置列表为报表格式,如下:
BOOL CEnumWindowsProcView::PreCreateWindow(CREATESTRUCT cs)
{
// TODO: Modify the Window class or styles here by modifying
// the CREATESTRUCT cs
cs.style |= LVS_REPORT | LVS_NOSORTHEADER;//设置列表视为报表格式
return CListView::PreCreateWindow(cs);
}
MFC 单文档视图中,怎样可以让EnumWindows()显示的字体是红色
如果枚举的窗口,不是本程序窗口,这几乎是不可能的。
你在EnumWindowProc中,调用的是GetWindowText之后SetWindowText吧,这样修改顶层窗口标题没问题,但变成红色,需要刷新窗口支持和安全画刷支持,这个在本程序窗口都有些麻烦,外部窗口太难实现了。-mfcenumwindows
建议你,用定时器做文字闪烁还靠谱些,文字变色就太麻烦了,至少我没试验前,还想不出安全的办法。
关于mfc中EnumWindows的回调函数的用法(如何在回调函数中调用类的成员函数或者成员变量)
可以把回调函数设置为类的static成员。也可以设置为全局函数,把类的指针传进去。
MFC中,如何获取一个已知窗口标题的窗口的句柄
使用windows API的FindWindow()函数;
函数原型为 :
HWND FindWindow
(
LPCSTR lpClassName,
LPCSTR lpWindowName
);
lpClassName
指向一个以null结尾的、用来指定类名的字符串或一个可以确定类名字符串的原子。如果这个参数是一个原子,那么它必须是一个在调用此函数前已经通过GlobalAddAtom函数创建好的全局原子。这个原子(一个16bit的值),必须被放置在lpClassName的低位字节中,lpClassName的高位字节置零。-mfcenumwindows
如果该参数为null时,将会寻找任何与lpWindowName参数匹配的窗口。
lpWindowName
指向一个以null结尾的、用来指定窗口名(即窗口标题)的字符串。如果此参数为NULL,则匹配所有窗口名。
返回值:
如果函数执行成功,则返回值是拥有指定窗口类名或窗口名的窗口的句柄。
如果函数执行失败,则返回值为 NULL 。可以通过调用GetLastError函数获得更加详细的错误信息。
可作如下使用:
HANDLE hDlg=::FindWindow(NULL,"")
if(hDlg!=NULL)
{
//Your operations
}
else
{
GetLastError();
}
如果您想熟悉使用API函数,可以下载一个MSDN帮助。里面介绍的是函数的使用方法以及参数的赋值操作