GetWindowLong()和SetWindowLong()的问题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了GetWindowLong()和SetWindowLong()的问题相关的知识,希望对你有一定的参考价值。

API大全上是这样写的:GetWindowLong()该函数获得有关指定窗口的信息,函数也获得在额外窗口内存中指定偏移位地址的32位度整型值。SetWindowLong()该函数改变指定窗口的属性。函数也将在指定偏移地址的一个32位值存入窗口的额外窗口存。这里"指定窗口消息"和"指定窗口属性"指的是什么东西,麻烦举个鲜明一下的例子,还有其中的那个"指定偏移地址"这个我更加摸不着头脑了,至于那个"额外存"指的是wndclass.cbWndExtra栏位吧!其实我只想弄明白wndclass.cbWndExtra栏位的那两个函数的作用,所以可以用自己最通俗的语言解说下,不是必要回答我上面的问题

我给你举个例子八
函数功能:该函数获得有关指定窗口的信息,函数也获得在额外窗口内存中指定偏移位地址的32位度整型值。
  函数原型:LONG
GetWindowLong(HWND
hWnd,int
nlndex);
  参数:
  hWnd:窗口句柄及间接给出的窗口所属的窗口类。
  nlndex:指定要检索的基于0的的偏移量。有效值的范围从0到窗口额外内存空间的字节数,最小为4。例如,若指定了12位或多于12位的窗体类的额外存储空间,则应设为第三个32位整数的索引位8。要获得任意其他值,指定下列值之一:
  GWL_EXSTYLE;获得扩展窗口风格。
  GWL_STYLE:获得窗口风格。
  GWL_WNDPROC:获得窗口过程的地址,或代表窗口过程的地址的句柄。必须使用GWL_WNDPROC函数调用窗口过程。
  GWL_HINSTANCE:获得应用事例的句柄。
  GWL_HWNDPAAENT:如果父窗口存在,获得父窗口句柄。
  GWL_ID:获得窗口标识。
  GWL_USERDATA:获得与窗口有关的32位值。每一个窗口均有一个与这个窗口相关的给用户使用的32位的数据。具体用途自定义。
  在hWnd参数标识了一个对话框时也可用下列值:
  DWL_DLGPROC:获得对话框过程的地址,或一个代表对话框过程的地址的句柄。必须使用函数CallWindowProc来调用对话框过程。
  DWL_MSGRESULT:获得在对话框过程中一个消息处理的返回值。
  DWL_USER:获得应用程序私有的额外信息,例如一个句柄或指针。
  返回值:如果函数成功,返回值是所需的32位值;如果函数失败,返回值是0。若想获得更多错误信息请调用
GetLastError函数。
  备注:通过使用函数RegisterClassEx将结构WNDCLASSEX中的cbWndExtra单元指定为一个非0值来保留额外类的存储空间。
  Windows
CE:nlndex参数指定的字节偏移量必须为
4的倍数。不支持
unaligmned
access。
  Windows
CE:不支持在参数nlndex中设定的GWL_HINSTANCE和GWL_HWNDPARENT。
  Windows
CE1.0也不支持在
nlndex参数中的
DWL_DLGPROC和
GWL_USERDATA。
  速查:Windows
NT:3.1以上版本;Windows:95以上版本;Windows
CE:1.0对以上版本;头文件:winuser.h;库文件:user32.lib;在Windows
NT上实现为Unicode和ANSI两种版本。
答案补充
函数原型
LONG
SetWindowLong(hwnd,nIndex,lNewLong)
HWND
hwnd;
/*
handle
of
window
*/
int
nIndex;
/*
offset
of
value
to
set
*/
LONG
lNewLong;
/*
new
value
*/
函数说明
SetWindowLong函数修改给定窗口的一个属性。该函数还在给定窗口的附加窗口内存中
的指定偏移量处设置一个32位(长)值。
参数详解
hwnd
标识窗口,并且间接标只出该窗口的属的窗口类。
nIndex
指定一个距离要设置的值的以0为基值的偏移量。有效的偏移量范围最小为0,最大为附
加窗口内存的总字节数减为4,注:整数为四个字节;例如:若附加内存被指定为12个或
更多个字节,值8将是第3个长整数的索引值。要设置其它值,则应指定下列值之一:



答案补充
GWL_EXSTYLE
设置新的扩展窗口风格。
GWL_STYLE
设置新的窗口风格
GWL_WNDPROC
为窗口过程设置新地址。
GWL_HINSTANCE
设置一个新的应用程序的实例句柄。
GWL_ID
设置一人新的窗口标识符。
GWL_USERDATA
设置与窗口相联系的长值。每个窗口都有一个供创建它的应用
程序使用的与之对应的长值。
当hwnd标识一个对话框时,还可使用下列值:



DWL_DLGPROC
设置对话框过程的新地址。
DWL_MSGRESULT
设置对话框过程所处理的消息的返回值。
DWL_USER
设置对应用程序来说是私有的新的附加信息:如句柄或打印机

lNewLong
指定该替换值。
返回值
若函数成功,返回值是指定的32位整数的原值;否则,返回值为0。使用GetLastError
函数可获取补充的错误信息。
答案补充
注释
若使用SetWindowLong函数和GWL_WNDPROC索引替换窗口过程,则给定的窗口过程必须遵
循WindowProc回调函数的说明中指定的准则。
使用GWL_WNDPROC索引调用SetWindowLong函数可创建该窗口类的子类(窗口类用来创建窗
口)。应用程序不得用另一个过程的窗口产生子类。
使用RegisterClass函数,并将WNDCLASS结构的cbWndExtra成员指定为一个非零值,便可
保留附加窗口内存。
不得将SetWindowLong与GWL_HWNDPARENT索引一起使用来改变一个子窗口的父窗口。要
改变子窗口的父窗口,应使用SetParent函数。
参考技术A 用LONG GetWindowLong(HWND hWnd,int nlndex);来说

在hWnd中填入窗口句柄(即指定窗口),在nIndex中填入以下定义:

GWL_EXSTYLE:获得扩展窗口风格。
GWL_STYLE:获得窗口风格。
GWL_WNDPROC:获得窗口过程的地址。wndclass.lpfnWndProc
GWL_HINSTANCE:获得应用程序的句柄。相当于wndclass.hInstance
GWL_HWNDPAAENT:如果父窗口存在,获得父窗口句柄。相当于GetParent()
GWL_ID:获得窗口标识。 相当于GetDlgCtrlID()
GWL_USERDATA:获得与窗口有关的32位值。每一个窗口均有一个由创建该窗口的应用程序使用的32位值。

调用完后,他就返回一个LONG值,如果你在nIndex中填入GWL_USERDATA,那么他就返回那个你在窗口创建时wndclass.cbWndExtra的值;这个栏位只是用来通知(傻乎乎地,自己通知自己)用的,系统从来不会管你在那里填什么,只要是一个DWORD。比如说:
/*........................*/
char *str="巧克力有益身体健康";
wndclass.cbWndExtra=str;

HWND hWnd=CreateWindow(/*........................*/);/*假如是它全局*/

/*N公里长的代码之后.......*/

if(strcmp( (char*)GetWindowLong(hWnd,GWL_USERDATA) , "巧克力有益身体健康")
EatChocolate(/*^_^*/);

完全是自己填,自己读,所谓用户数据嘛,一般情况下,Get/SetWindowLong比较有用的是,应用程序实例句柄和样式的获取和设定,别的都可以用其他函数替代, wndclass.cbWndExtra我通常都空着。
不明白追问。

以上是关于GetWindowLong()和SetWindowLong()的问题的主要内容,如果未能解决你的问题,请参考以下文章

GetWindowLong()和SetWindowLong()的问题

GetWindowLong 丢失字段数据

VC++ SetWindowLong/GetWindowLong函数疑问

禁用窗体关闭按钮(使用GetWindowLong修改GWL_STYLE)

Delphi 窗体函数GetWindowLong-获取指定窗口的信息

VB关于GetWindowLong(hwnd,GWL_HINSTANCE)的问题