delphi 开发
句柄,是个什么东西,它有什么用呢,为什么要使用句柄?
[明了地解释一下,深层的东西不太理解]高手们,快快现身吧~~~

解决方案 »

  1.   

    句柄主要是来调用API函数吧,是一个对象的标示即指定对象的唯一性
      

  2.   

    在程序开发中,有很多使用到句柄了,不明白为什么要使用它,比如有人将 treeview的每个节点前加上复选框:
    procedure TForm3.FormCreate(Sender: TObject);
    var
      H:HWND ;
    begin
     H:=TreeView1.Handle ;
     SetWindowLong(h,GWL_STYLE,GetWindowLong(h,GWL_STYLE )or TVS_CHECKBOXES );
     with TreeView1 do
     begin
       Align :=alLeft ;
       Items.Add(nil,'AAA');
       Items.Add(nil,'BBB');
       Items.Add(nil,'CCC');
       Items.AddChild(Items [2],'111');
       Items.AddChild(Items [2],'222');
       Items.AddChild(Items [2],'333');
     end;
    end;不是太理解~~~
      

  3.   

    Windows   句柄   
    Delphi从Windows   引入了不少数据类型,其中句柄最重要。这种数据类型名为THandle,该类型在Windows   单元中定义: type 
        THandle   =   LongWord; 句柄数据类型通过数字实现,但并不当数字用。在Windows   中,句柄是一个系统内部数据结构的引用。例如,当你操作一个窗口,或说是一个Delphi   窗体时,系统会给你一个该窗口的句柄,系统会通知你:你正在操作142号窗口,就此,你的应用程序就能要求系统对142号窗口进行操作——移动窗口、改变窗口大小、把窗口极小化为图标,等等。实际上许多Windows   API   函数把句柄作为它的第一个参数,如GDI   (图形设备接口)句柄、菜单句柄、实例句柄、位图句柄等等,不仅仅局限于窗口函数,。 换句话说,句柄是一种内部代码,通过它能引用受系统控制的特殊元素,如窗口、位图、图标、内存块、光标、字体、菜单等等。Delphi中很少需要直接使用句柄,因为句柄藏在窗体、位图及其他Delphi对象的内部。当你要调用Delphi不支持的Windows   API   函数时,句柄才会有用。 现在举一个简单的Windows句柄例子,完善这节内容。例WHandle   程序的窗体很简单,只有一个按钮。正如下面主窗体文本所定义的那样,我在代码中添加了窗体的OnCreate   事件和按钮的OnClick   事件: object   FormWHandle:   TFormWHandle 
        Caption   =   'Window   Handle ' 
        OnCreate   =   FormCreate 
        object   BtnCallAPI:   TButton 
            Caption   =   'Call   API ' 
            OnClick   =   BtnCallAPIClick 
        end 
    end 
    窗体一创建,程序就会通过窗体本身的Handle   属性,获取窗体对应的窗口句柄。调用IntToStr   ,把句柄数值转换为一个字符串,然后再把它添加到窗体标题中,如图9.1: procedure   TFormWHandle.FormCreate(Sender:   TObject); 
    begin 
        Caption   :=   Caption   +   '   '   +   IntToStr   (Handle); 
    end; 
    因为FormCreate   是窗体类的方法,它可直接访问同类的其他属性和方法。因此,在这个过程中我们能够直接访问窗体的Caption   属性和Handle   属性。 图   9.1:   例   WHandle   显示窗体句柄,每次运行程序得到的句柄值不同     如果你多此次执行该程序,通常会获得不同的句柄值。这个值实际上是由Windows   操作系统确定并返回给应用程序的。(句柄从来不是由程序决定的,而且句柄没有预定义值,句柄是由系统决定的,每执行一次程序,产生一个新值。) 当你单击按钮,程序将调用Windows   API   函数SetWindowText,它会根据第一个传递参数改变窗口的标题。更准确地说,所用的API   函数其第一个参数是需要修改窗体的句柄: procedure   TFormWHandle.BtnCallAPIClick(Sender:   TObject); 
    begin 
        SetWindowText   (Handle,   'Hi '); 
    end; 
    这段代码与前面所讲的事件处理程序等效,它通过给窗体的Caption   属性赋一个新值,改变窗体的标题。 
      

  4.   

    Windows   句柄   
    Delphi从Windows   引入了不少数据类型,其中句柄最重要。这种数据类型名为THandle,该类型在Windows   单元中定义: type 
        THandle   =   LongWord; 句柄数据类型通过数字实现,但并不当数字用。在Windows   中,句柄是一个系统内部数据结构的引用。例如,当你操作一个窗口,或说是一个Delphi   窗体时,系统会给你一个该窗口的句柄,系统会通知你:你正在操作142号窗口,就此,你的应用程序就能要求系统对142号窗口进行操作——移动窗口、改变窗口大小、把窗口极小化为图标,等等。实际上许多Windows   API   函数把句柄作为它的第一个参数,如GDI   (图形设备接口)句柄、菜单句柄、实例句柄、位图句柄等等,不仅仅局限于窗口函数,。 换句话说,句柄是一种内部代码,通过它能引用受系统控制的特殊元素,如窗口、位图、图标、内存块、光标、字体、菜单等等。Delphi中很少需要直接使用句柄,因为句柄藏在窗体、位图及其他Delphi对象的内部。当你要调用Delphi不支持的Windows   API   函数时,句柄才会有用。 现在举一个简单的Windows句柄例子,完善这节内容。例WHandle   程序的窗体很简单,只有一个按钮。正如下面主窗体文本所定义的那样,我在代码中添加了窗体的OnCreate   事件和按钮的OnClick   事件: object   FormWHandle:   TFormWHandle 
        Caption   =   'Window   Handle ' 
        OnCreate   =   FormCreate 
        object   BtnCallAPI:   TButton 
            Caption   =   'Call   API ' 
            OnClick   =   BtnCallAPIClick 
        end 
    end 
    窗体一创建,程序就会通过窗体本身的Handle   属性,获取窗体对应的窗口句柄。调用IntToStr   ,把句柄数值转换为一个字符串,然后再把它添加到窗体标题中,如图9.1: procedure   TFormWHandle.FormCreate(Sender:   TObject); 
    begin 
        Caption   :=   Caption   +   '   '   +   IntToStr   (Handle); 
    end; 
    因为FormCreate   是窗体类的方法,它可直接访问同类的其他属性和方法。因此,在这个过程中我们能够直接访问窗体的Caption   属性和Handle   属性。 图   9.1:   例   WHandle   显示窗体句柄,每次运行程序得到的句柄值不同     如果你多此次执行该程序,通常会获得不同的句柄值。这个值实际上是由Windows   操作系统确定并返回给应用程序的。(句柄从来不是由程序决定的,而且句柄没有预定义值,句柄是由系统决定的,每执行一次程序,产生一个新值。) 当你单击按钮,程序将调用Windows   API   函数SetWindowText,它会根据第一个传递参数改变窗口的标题。更准确地说,所用的API   函数其第一个参数是需要修改窗体的句柄: procedure   TFormWHandle.BtnCallAPIClick(Sender:   TObject); 
    begin 
        SetWindowText   (Handle,   'Hi '); 
    end; 
    这段代码与前面所讲的事件处理程序等效,它通过给窗体的Caption   属性赋一个新值,改变窗体的标题。 
      

  5.   

    SetWindowLong(h,GWL_STYLE,GetWindowLong(h,GWL_STYLE )or TVS_CHECKBOXES );
    中的h就是句柄,而且h:=TreeView1.Handle ;
    也就是说可以写成
    SetWindowLong(TreeView1.Handle ,GWL_STYLE,GetWindowLong(TreeView1.Handle ,GWL_STYLE )or TVS_CHECKBOXES );
    再看SetWindowLong函数,
    函数SetWindowLong中的第一个参数为句柄参数,其实就是让函数知道给谁加复选框。
    如果你不写句柄,那么这个复选框给谁加呢。
    句柄起了识别作用。
      

  6.   

    好好看下 WINDOWS程序设计吧
    那上边都有详细说明的
    MSDN上也有 
      

  7.   


    怎样知道哪些是Delphi支持的Windows API 函数,哪些是不支持的?
      

  8.   

    【Delphi不支持的Windows API 函数】
    并不是Delphi不能使用某些Windows API 函数
    而是Delphi没自行实现(封装)的功能,还可以直接使用对应的Windows API 函数来实现
      

  9.   

    WINDOWS提供的API一般都是以COM或DLL来实现的,如果没有DELPHI,你可能需要自己调用DLL,获取DLL函数地址,调用函数。
    而在DELPHI中,它帮你做了一些常用API的封装,并且对一般开发用户来讲,使用难度已大大降低
    有兴趣可看一下windows.pas单元(好久不用delphi了,应该是这个)