GetWindowLong函数(最好的解释资料,绝对值得一看,此函数在子类化技巧时候经常用到)
2013-01-22 12:45
309 查看
原文链接
今天在看一个代码里头写了GetWindowLong (hwnd, 0),我当时就有点费解,靠,上网 搜索函数原型说明,死活找不到第2个参数为0是指什么,MD,很恼火,最近终于在一个 国外网站找到,我在这篇文章贴了,网站是 http://www.codeguru.com/forum/archive/index.php/t-243778.html 先收集所有关于此函数的使用方法以及程序代码 希望后来的人看到我的这篇文章能感动哈: 函数功能描述:用这个函数能够获得指定窗口的信息 函数原型: LONG GetWindowLong( HWND hWnd,int nIndex ) 参数: hWnd:指定窗口的句柄 nIndex:需要获得的信息的类型 值 功能 nIndex取值如下: GWL_EXSTYLE 得到扩展的窗口风格 GWL_STYLE 得到窗口风格 GWL_WNDPROC 得到窗口回调函数的地址,或者句柄。得到后必须使用CallWindowProc函数来调用 GWL_HINSTANCE 得到应用程序运行实例的句柄 GWL_HWNDPARENT 得到父窗口的句柄 GWL_ID 得到窗口的标识符 GWL_USERDATA 得到和窗口相关联的32位的值(每一个窗口都有一个有意留给创建窗口的应用程序是用的32位 的值) 当hWnd标识一个对话框时可以使用下面的值 Value Action DWL_DLGPROC 得到对话框回调函数的地址,或者句柄。得到后必须使用CallWindowProc函数来调用 DWL_MSGRESULT 得到对话框回调函数中消息处理过程的返回值 DWL_USER 得到额外的应用程序私有信息,如一些句柄和指针等 返回值: 成功时,返回一个请求的32位的值 失败时,返回0,可以使用GetLastError来取得错误信息 注意: /* * Window field offsets for GetWindowLong() */ #define GWL_WNDPROC (-4) #define GWL_HINSTANCE (-6) #define GWL_HWNDPARENT (-8) #define GWL_STYLE (-16) #define GWL_EXSTYLE (-20) #define GWL_USERDATA (-21) #define GWL_ID (-12) /* * Get/SetWindowWord/Long offsets for use with WC_DIALOG windows */ #define DWL_MSGRESULT 0 #define DWL_DLGPROC 4 #define DWL_USER 8 示例1: long nStyle = ::GetWindowLong(hWnd, GWL_STYLE); // hWnd是一个编辑框的句柄 if(nStyle & ES_PASSWORD) { AfxMessageBox("这是一个密码域"); } 示例2: LONG GetWindowLong( HWND hWnd, // handle of window int nIndex // offset of value to retrieve ); 第二个参数是0的话,就是指定GW_HWNDFIRST!!! 你想用应用程序自定义数据的话,需要指定第二个参数为GWL_USERDATA(-21) 、、、、、、、、、、、、、、、、、、 SetWindowLong (hwnd, 0, 1^GetWindowLong (hwnd, 0)) ; 小弟初学API,对这个函数不是很了解,看了MSDN也还不清楚,特别是作为参数的1^GetWindowLong (hwnd, 0),这个“^”是什么意思,望高手指点迷津 SetWindowLong函数,该函数将改变指定窗口的特殊属性.下面是它的声明: Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA"(ByVal hwnd As Long, ByVal nIndex As Long,ByVal dwNewLong As Long) As Long 第一个参数代表要进行子类处理的窗口,第二个参数应该是GWL_WNDPROC(-4),第三个参数是新的窗口函数的地址 此函数将在窗口取得焦点,发生事件,或其他情况下(如其他进程改变了系统的某些参数)被随时调用. 如果发生错误SetWindowLong函数将返回0,否则将返回原来的窗口函数的地址.这个地址特别重要,你应该把它保存在一个变量中或其他地方.当你不处理某些消息时(实际上,你可能只处理不到1%的消息,其他的都将由原窗口函数处理),调用原来的窗口函数就需要该地址. //////////////////////////////////////////////////////////////////////////////////////////// 其他人提出的疑问:::::: ^是异或。 因为GetWindowLong失败后返回0,这条语句的意思就是说当窗口没有这种属性的时候才给它添加这种属性。通俗点说,就是先Get,得不到,再Set。 另外Index == 0设置的是什么属性呢?二楼的说应该是GWL_WNDPROC(-4),依据是什么? 1楼yxwmxkq(酷得经动了党)回复于 2002-12-12 21:06:32 得分 0 我的目的是:创建子类时:CreateWindow(...,(HINSTANCE)GetWindowLong(hwnd,GWL_HINSTANCE),NULL); 我只是想确定一下,SetWindowLong(hwnd,0,0)是不是把extra window memory 中的long置0,而SetWindowLong(hwnd,0,1)则置为1,如果不是,该如何设置SetWindowLong函数使extra window memory 中的Long型数值为0或1,当然0和1的变换我用1^GetWindowLong(hwnd,0)不知是否正确。3x!! Top 2 楼sans(长风半日)回复于 2002-12-13 09:56:03 得分 50如果要操作User data,你首先要在该窗口WNDCLASS的cbWndExtra中设定扩展数据的大小,然后RegisterClass,之后使用GetWindowLong( hWnd, GWL_USERDATA + 0 );、GetWindowLong( hWnd, GWL_USERDATA + 1 );等进行读操作,使用SetWindowLong( hWnd, GWL_USERDATA + 0, lData );、SetWindowLong( hWnd, GWL_USERDATA + 1, lData );等进行写操作。
相关文章推荐
- GetWindowLong函数(最好的解释资料,绝对值得一看,此函数在子类化技巧时候经常用到)
- GetWindowLong函数(最好的解释资料,绝对值得一看,此函数在子类化技巧时候经常用到)
- GetWindowLong函数(最好的解释资料,绝对值得一看,此函数在子类化技巧时候经常用到)
- GetWindowLong函数(最好的解释资料,绝对值得一看,此函数在子类化技巧时候经常用...
- 140个绝对绝对值得收藏的电脑技巧
- php编程中经常需要用到一些服务器的一些资料 $_SERVER[]
- 文章解析整理:《如果你还没搞懂LSTM 网络,那本文绝对值得一看》
- 立即执行函数表达式 项目经常用到js 代码Module模式
- 最值得一看的几条简单的谷歌 Google 搜索技巧,瞬间提升你的网络搜索能力!
- SQL Server中经常会用到的与时间相关的函数
- 一些经常会用到的vbscript检测函数
- 值得所有人一看的面试技巧(一)
- ASP.NET编程中经常会用到的27个函数集
- ASP.NET编程中经常会用到的27个函数集
- 在做Asp.Net开发的时候,经常会遇到页面乱码的问题,下面是在网上收集的相关资料,请大家参考:
- 一些经常会用到的vbscript检测函数
- c# 解释器模式与sping.net表达式的结合应用(金融里经常需要用到公式,这个公式是抽象的需要自己解释)
- asp.net customdatagrid 或gridview绑定数据的时候经常要用到的 ItemDataBound 事件的方法
- dm9000驱动中用到一些函数的解释
- 经常用到的javascript功能函数收集!--转