热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

GetWindowLong函数

今天在看一个代码里头写了GetWindowLong(hwnd,0),我当时就有点费解,靠,上网搜索函数原型说明,死活找不到第

今天在看一个代码里头写了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   );等进行写操作。   
  

转帖:http://blog.csdn.net/hnhyhongmingjiang/article/details/2154410


推荐阅读
  • PHP反射API的功能和用途详解
    本文详细介绍了PHP反射API的功能和用途,包括动态获取信息和调用对象方法的功能,以及自动加载插件、生成文档、扩充PHP语言等用途。通过反射API,可以获取类的元数据,创建类的实例,调用方法,传递参数,动态调用类的静态方法等。PHP反射API是一种内建的OOP技术扩展,通过使用Reflection、ReflectionClass和ReflectionMethod等类,可以帮助我们分析其他类、接口、方法、属性和扩展。 ... [详细]
  • 本文介绍了在Windows环境下如何配置php+apache环境,包括下载php7和apache2.4、安装vc2015运行时环境、启动php7和apache2.4等步骤。希望对需要搭建php7环境的读者有一定的参考价值。摘要长度为169字。 ... [详细]
  • 云原生边缘计算之KubeEdge简介及功能特点
    本文介绍了云原生边缘计算中的KubeEdge系统,该系统是一个开源系统,用于将容器化应用程序编排功能扩展到Edge的主机。它基于Kubernetes构建,并为网络应用程序提供基础架构支持。同时,KubeEdge具有离线模式、基于Kubernetes的节点、群集、应用程序和设备管理、资源优化等特点。此外,KubeEdge还支持跨平台工作,在私有、公共和混合云中都可以运行。同时,KubeEdge还提供数据管理和数据分析管道引擎的支持。最后,本文还介绍了KubeEdge系统生成证书的方法。 ... [详细]
  • 本文分享了一个关于在C#中使用异步代码的问题,作者在控制台中运行时代码正常工作,但在Windows窗体中却无法正常工作。作者尝试搜索局域网上的主机,但在窗体中计数器没有减少。文章提供了相关的代码和解决思路。 ... [详细]
  • android listview OnItemClickListener失效原因
    最近在做listview时发现OnItemClickListener失效的问题,经过查找发现是因为button的原因。不仅listitem中存在button会影响OnItemClickListener事件的失效,还会导致单击后listview每个item的背景改变,使得item中的所有有关焦点的事件都失效。本文给出了一个范例来说明这种情况,并提供了解决方法。 ... [详细]
  • 如何使用Java获取服务器硬件信息和磁盘负载率
    本文介绍了使用Java编程语言获取服务器硬件信息和磁盘负载率的方法。首先在远程服务器上搭建一个支持服务端语言的HTTP服务,并获取服务器的磁盘信息,并将结果输出。然后在本地使用JS编写一个AJAX脚本,远程请求服务端的程序,得到结果并展示给用户。其中还介绍了如何提取硬盘序列号的方法。 ... [详细]
  • Windows下配置PHP5.6的方法及注意事项
    本文介绍了在Windows系统下配置PHP5.6的步骤及注意事项,包括下载PHP5.6、解压并配置IIS、添加模块映射、测试等。同时提供了一些常见问题的解决方法,如下载缺失的msvcr110.dll文件等。通过本文的指导,读者可以轻松地在Windows系统下配置PHP5.6,并解决一些常见的配置问题。 ... [详细]
  • 本文介绍了在Mac上搭建php环境后无法使用localhost连接mysql的问题,并通过将localhost替换为127.0.0.1或本机IP解决了该问题。文章解释了localhost和127.0.0.1的区别,指出了使用socket方式连接导致连接失败的原因。此外,还提供了相关链接供读者深入了解。 ... [详细]
  • 本文介绍了Linux系统中正则表达式的基础知识,包括正则表达式的简介、字符分类、普通字符和元字符的区别,以及在学习过程中需要注意的事项。同时提醒读者要注意正则表达式与通配符的区别,并给出了使用正则表达式时的一些建议。本文适合初学者了解Linux系统中的正则表达式,并提供了学习的参考资料。 ... [详细]
  • HDFS2.x新特性
    一、集群间数据拷贝scp实现两个远程主机之间的文件复制scp-rhello.txtroothadoop103:useratguiguhello.txt推pushscp-rr ... [详细]
  • 原理:dismiss再弹出,把dialog设为全局对象。if(dialog!null&&dialog.isShowing()&&!(Activity.)isFinishing()) ... [详细]
  • Android源码中的Builder模式及其作用
    本文主要解释了什么是Builder模式以及其作用,并结合Android源码来分析Builder模式的实现。Builder模式是将产品的设计、表示和构建进行分离,通过引入建造者角色,简化了构建复杂产品的流程,并且使得产品的构建可以灵活适应变化。使用Builder模式可以解决开发者需要关注产品表示和构建步骤的问题,并且当构建流程发生变化时,无需修改代码即可适配新的构建流程。 ... [详细]
  • Jquery 跨域问题
    为什么80%的码农都做不了架构师?JQuery1.2后getJSON方法支持跨域读取json数据,原理是利用一个叫做jsonp的概念。当然 ... [详细]
  • 本文介绍了iOS开发中检测和解决内存泄漏的方法,包括静态分析、使用instruments检查内存泄漏以及代码测试等。同时还介绍了最能挣钱的行业,包括互联网行业、娱乐行业、教育行业、智能行业和老年服务行业,并提供了选行业的技巧。 ... [详细]
  • 抽空写了一个ICON图标的转换程序
    抽空写了一个ICON图标的转换程序,支持png\jpe\bmp格式到ico的转换。具体的程序就在下面,如果看的人多,过两天再把思路写一下。 ... [详细]
author-avatar
朵朵妞er
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有