好像是:
application.handle指向程序进程的入口地址
主窗口的handle指向主窗口对象的地址
肯定是不一样的

解决方案 »

  1.   

    好像是:
    application.handle指向程序进程的地址
    主窗口的handle指向主窗口对象的地址
      

  2.   

    我认为Application.handle为程序窗口的句柄,而Form.handle为主窗体的句柄,在一程序中,Application窗口即是任务栏上的按钮。
      

  3.   

    1、两个都是窗体,用ShowWindow(Application.Handle)可以将其显示出来,
    2、
      

  4.   

    它们之间是有区别的:
    1、如果设定的窗口级别为全屏幕独占方式,
    则这个Handle一定要是Application.Handle而不是MainForm.Handle
    2、MainForm.Handle应该特指有子窗体的工程中
      

  5.   

    你用 Applicaton.Handle  创建无模式窗体,可以关闭你创建的窗体,如果你用Form.Handle 则 创建的窗体也关闭
      

  6.   

    bill_lasker:
        你没搞清楚句柄和指针的区别。zhuliang1981:
        程序窗口和主窗口的区别又是什么?budi:
        用ShowWindow(Application.Handle)显示不出来  :(cg1120(代码最优化-§人在爱情的空窗期要个梦§) :
        全屏幕独占方式?怎么独占?
        特指有子窗体的工程?哪个工程没有子窗体?
      

  7.   

    ShowWindow(inttostr(Application.Handle))
    ShowWindow(inttostr(frmMain.Handle))
    结果肯定不一样
      

  8.   

    "2、MainForm.Handle应该特指有子窗体的工程中"
    应该是MDI主窗体
      

  9.   

    huhe(胡呵) 说的很对,大家没有说到本质问题?
    请huhe(胡呵)说说自己的看法???
    大家有什么看法说出来,讨论一下(但请回答的人自己先搞清楚在说,谢谢!!!:))
      

  10.   

    cg1120(代码最优化-§人在爱情的空窗期要个梦§) :
        你看看TForm的FormStyle属性,默认是fsNormal,而不是fsMDIForm
        而在fsNormal的工程中,Application.Handle和MainForm.Handle也是不一样的
      

  11.   

    2 netlib(河外孤星) :
    对于这句话:但请回答的人自己先搞清楚在说,
    若先搞清楚了,还用讨论吗?
      

  12.   

    bill_lasker:
      老说废话,前一贴写了两句“ShowWindow(inttostr……”,我估计你是想写“ShowMessage”吧,人家问题里问的就是这两个handle为什么不一样,还用你再错误的语句指出来?netlib(河外孤星) 让回答问题的人先把搞清楚问的是什么问题,你又在那儿废话干吗?我这贴也是废话,请其他人就不用浪费帖子骂我了
      

  13.   

    Application.Handle是整个程序的顶级HANDLE(PARENT),主FORM的HANDLE是APPLICATION.HANDLE的子HANDLE。
      

  14.   

    FHandle := CreateWindow(WindowClass.lpszClassName, PChar(FTitle),
          WS_POPUP or WS_CAPTION or WS_CLIPSIBLINGS or WS_SYSMENU
          or WS_MINIMIZEBOX,
          GetSystemMetrics(SM_CXSCREEN) div 2,
          GetSystemMetrics(SM_CYSCREEN) div 2,
          0, 0, 0, 0, HInstance, nil);
    这是APPLICATION创建窗口句柄的调用,其中WindowClass.lpszClassName=‘TApplication’,奇怪的是最后一个参数为nil,本来是设置窗口的X,Y坐标和大小等。帮助中没有解释最后一个参数为nil表示什么意思,但我猜测因为创建的窗口并不用于显示,只是提供一个默认的消息处理过程。注册的TApplication窗口类名的属性是
      WindowClass: TWndClass = (
        style: 0;
        lpfnWndProc: @DefWindowProc;
        cbClsExtra: 0;
        cbWndExtra: 0;
        hInstance: 0;
        hIcon: 0;
        hCursor: 0;
        hbrBackground: 0;
        lpszMenuName: nil;
        lpszClassName: 'TApplication');
      

  15.   

    我认为区别不是很大
    .在一个exe文件中,application.handle其实就是mainwindow.handle
    .在一个dll文件中,application.handle是提供给外部调用窗口用来访问本dll主窗口的
      

  16.   

    surfguy(冲浪小子) :
        你说的全错了
        在一个exe文件中,application.handle和mainwindow.handle不一样
        在一个dll文件中,就没有application对象,当你加了forms单元后,application.handle是零
      

  17.   

    跟踪Application它在Application.Initialize;(初始化)之前就有了,
    跟踪forms里,也是找不到application.handle是何时得到的。
      

  18.   

    application与mainform根本就不是一回事。
      

  19.   

    TApplication.Handle:Use Handle when calling Windows API functions that require a parent window handle. For example, a DLL that displays its own top-level pop-up windows needs a parent window to display its windows in the application. Using the Handle property makes such windows part of the application, so that they are minimized, restored, enabled, and disabled with the application.Tform.handle:The Handle property returns the window handle for the underlying Microsoft Windows screen object. Use the Handle property to bypass the VCL API and directly access the underlying window.
      

  20.   

    to LXJ2001(lxj) 
    FHandle := CreateWindow(WindowClass.lpszClassName, PChar(FTitle),
          WS_POPUP or WS_CAPTION or WS_CLIPSIBLINGS or WS_SYSMENU
          or WS_MINIMIZEBOX,
          GetSystemMetrics(SM_CXSCREEN) div 2,
          GetSystemMetrics(SM_CYSCREEN) div 2,
          0, 0, 0, 0, HInstance, nil);
    这是APPLICATION创建窗口句柄的调用,其中WindowClass.lpszClassName=‘TApplication’,奇怪的是最后一个参数为nil,本来是设置窗口的X,Y坐标和大小等
    其实你说对了一半,application就是主窗体为0的一个看不见的窗体,其他的窗体都是这个主窗体的子窗体!
      

  21.   

    偶也同意同意cpls(温柔一刀)的
    关注中……
      

  22.   

    这是在delphi本身的帮助中说的application.handleProvides access to the window handle of the main form (window) of the application.property Handle: HWND;DescriptionUse Handle when calling Windows API functions that require a parent window handle. For example, a DLL that displays its own top-level pop-up windows needs a parent window to display its windows in the application. Using the Handle property makes such windows part of the application, so that they are minimized, restored, enabled, and disabled with the application.Note: When writing a DLL that uses VCL forms, assign the window handle of the host EXE main window to the DLL Application.HandleApplication->Handle property. This makes the DLL form part of the host application. Never assign to the Handle property in an EXE.
      

  23.   

    我也试过了,确实在Application.Initialize之前就有了,不知道怎么回事还是听到家的吧!
      

  24.   

    以上回答不让人满意,只有胡呵说的完全正确,但只是提出了大家的错误,
    没有解决问题。
     LXJ2001(lxj) 帖出的代码我已经看过了,但这能说明application.handle的创建时间和它的本质,还有,如果application本身是一个不让用户看到的窗口,那什么不直接使用mainfm.handle呢,请指教。谢谢!!!
      

  25.   

    Masting Delphi6的
    var 
      OldStyle: Integer;
    begin
      OldStyle := GetWindowLong(Application.Handle, GWL_STYLE);
      SetWindowLong(Application.Handle, GWL_STYLE, OldStyle or     WS_THICKFRAME or WS_CAPTION);
    SetWindowPos(Application.Handle, 0, 0, 200, 100, SWP_NOMOVE or SWP_NOZORDER);
    end;
      

  26.   

    Application.Handle就是工具条上的那个条条
    Form.Handle就是窗体。
      

  27.   

    我也乱说呀这两者是不同的,因为WIN的资源不同,但在大者有FORM的程序下有什么不同呢在VC中
    一个是APP,一个是WIN
    但在DELPHI中我看只是要用到canvas的时候不一样吧,
    反正开Application的时候自动激活主FORM
    关主FORM的时候,也会关上APPLICATION
    是DELPHI把这个东西做在一起了,WIN也把这两个做在一起了,
    为什么还要两个,
    因为。我想是不是开多线程是不一样的,或者是在释放某些DLL时是一不样的呢?或者是程序就错了,有了异常,你一定关不掉主FORM吧,
    但WIN利用关掉APPLICATION就可以结束程序,
    如果你的消息一直是对的,但在这两者之中再有什么动作,我就不知道了我想这就是有的人用
    close

    application.teminate
    的差别
    前者发出了WM_quit的消息
    而后者。
    我上回是一下子就关上了,不管里面有没有文件,
    但有些时间了,
    大家能不能再测一测,
    谢谢了,
      

  28.   

    打错了这么多,重来一遍!这两者是不同的,因为WIN的资源不同,但在大都有FORM的程序下有什么不同呢?在VC中
    一个是APP,一个是WIN
    但在DELPHI中,我看只是要用到canvas的时候不一样吧,
    反正开Application的时候自动激活主FORM
    关主FORM的时候,也会关上APPLICATION
    是DELPHI把这个东西做在一起了,WIN也把这两个*消息*做在一起了,
    为什么还要两个,
    因为。我想是不是开多线程是不一样的,或者是在释放某些DLL时是一不样的呢?或者是程序就错了,有了异常,你一定关不掉主FORM吧,
    但WIN利用关掉APPLICATION就可以结束程序,
    如果你的消息一直是对的,但在这两者之中再有什么动作,我就不知道了我想这就是有的人用
    close

    application.teminate
    的差别
    前者发出了WM_quit的消息
    而后者。
    我才试了一下,一下子就关上了,不管里面有没有文件没存,
    大家能不能再测一测异常的时候,是不是关不掉主FORM,但能关上APP,
    谢谢了,
    对不起,打字有点问题,不,问题很大
      

  29.   

    Handle: 句柄; //描述的是系统资源的标识//用于区分不同的资源系统的资源这就多了,有文件资源资源、图标资源、内存资源....
    所有的资源都是通过Handle来处理和区分的首先:
    Application.Handle//这是运用程序资源的标识
    Application.MainForm.Handle//这是窗体资源的标识
    一种资源是窗体、另一中资源是运用程序
    两种资源的类型都不同,可以说没有太大的可比性
    Application.MainForm.Handle和Form2.Handle才是同一个类型
    要知道 运用程序 不是一个Form,主窗体只是它的一个元素procedure TApplication.CreateHandle;
    var
      TempClass: TWndClass;
      SysMenu: HMenu;
    begin
      if not FHandleCreated and not IsConsole then
      begin
        FObjectInstance := MakeObjectInstance(WndProc);
        if not GetClassInfo(HInstance, WindowClass.lpszClassName, TempClass) then
        begin
          WindowClass.hInstance := HInstance;
          if Windows.RegisterClass(WindowClass) = 0 then
            raise EOutOfResources.Create(SWindowClass);
        end;
    //-----------------------------------
        FHandle := CreateWindow(WindowClass.lpszClassName, PChar(FTitle),
          WS_POPUP or WS_CAPTION or WS_CLIPSIBLINGS or WS_SYSMENU
          or WS_MINIMIZEBOX,
          GetSystemMetrics(SM_CXSCREEN) div 2,
          GetSystemMetrics(SM_CYSCREEN) div 2,
          0, 0, 0, 0, HInstance, nil);
    //-----------------------------------
        FTitle := '';
        FHandleCreated := True;
        SetWindowLong(FHandle, GWL_WNDPROC, Longint(FObjectInstance));
        if NewStyleControls then
        begin
          SendMessage(FHandle, WM_SETICON, 1, GetIconHandle);
          SetClassLong(FHandle, GCL_HICON, GetIconHandle);
        end;
        SysMenu := GetSystemMenu(FHandle, False);
        DeleteMenu(SysMenu, SC_MAXIMIZE, MF_BYCOMMAND);
        DeleteMenu(SysMenu, SC_SIZE, MF_BYCOMMAND);
        if NewStyleControls then DeleteMenu(SysMenu, SC_MOVE, MF_BYCOMMAND);
      end;
    end;
    procedure TWinControl.CreateWindowHandle(const Params: TCreateParams);
    begin
      with Params do
        FHandle := CreateWindowEx(ExStyle, WinClassName, Caption, Style,
          X, Y, Width, Height, WndParent, 0, WindowClass.hInstance, Param);
    end;
      

  30.   

    偶也同意同意cpls(温柔一刀)的
    我就不同意,
    这不是子不子的问题,如果是的话,那么完全可以关了子Handle而父HANDLE还在但我做不到,
    我想我也试过了,确实在Application.Initialize之前就有了,不知道怎么回事还是听到家的吧!这可能是WIN给每个EXE的HANDLE,是不是每一次不一样呀??用close有许多问题,不如application.teminate干净,
    有好多文章这样说过,我想这也是两个HANDLE中间的差别APPLICACION的HANDLE,是整个程序的,如前面加载了DLL,或COM而使COM的计数加1了,关APPLICATION也要反向做的,
    不过,我们认为没有差别的原因是,
    关上主FORM后,APPLICATION马上也关了,我们察不出有什么差别,
    只有他们不同步的时候,我们才能看出有什么不同来,
    如做一个死循环,用主FORM的HANDLE就不行了,就得用APP的,
    是不是?以上说的不一定对,请大家再指正呀
      

  31.   

    呵呵,不知道大家看过《Programming Windows》没有,这里面其实说得很清楚,我看的是中文版,呵呵,说说自己的理解吧。大家在以前的Ms-dos方式下的C编程里肯定都知道Main这个入口函数,现在在Windows里面这个函数也仍然存在,不管是用Delphi还是VC或是VB,到了最后都会调用这个函数,在调用这个函数之前(我觉得应该是)Windows会自动为调用这个Winmain函数的程序分配一个好长好长的整型(呵呵,其实也不会太长),这个长整型数值一般用变量hInstance来表示,这个就是Program的句柄(其实就类似于一个名字,只不过要独一无二,而且Windows得能够解析)。当启动了一个ProGram后,程序会创建一个Window,函数为CreateWindow,这个就是我们程序的某一个界面,用Delphi的话就是第一个Form,也可以称之为主Form,这个函数会返回一个hwnd,这个就是主Form的句柄。因此,我觉得实际上句柄就是一个Windows对各个程序的命名,是它给自己的各个孩子(程序和程序中的Form和控件)起的名字。
    由于CreateWindow运行时有一个参数为hInstance,这个就是Delphi中的Application.Handle,因此,很明显application.handle比主窗口的Handle早。具体时间应该是在Windows刚开始运行这个可执行文件时就马上给这个可执行文件分配hInstance(Application.Handle),然后调用Winmain函数,在这个函数里CreateWindow,从而产生楼主所说的mainform.Handle。以上为我的理解,希望能有高手表示一下我这样描述是否正确。
    另:不知道楼主netlib (河外孤星)是否对这个问题很清楚,不清楚的话为什么对别的评语似乎都很自信,似乎很了解事情的本质?清楚的话为什么发这个贴子呢?
      

  32.   

    TO aaronzhang(风不息),我不清楚其中的本质,但有些人说的是错误的,这个我却知道。请问刚才说application.handle就是任务栏上的那个窗体的handle,那么是不是在VC中写的时候也要创建两个呢(对不起,我对VC不熟:));有人说application.handle是应该程序的handle,那么请问应用程序(也就是进程)怎么会有handle呢?我是没有搞清楚才提问的?不会和大家开这种玩笑,:)
      

  33.   

    aaronzhang(风不息)的看法似乎有些问题,看下面tapplication.createhandle代码procedure TApplication.CreateHandle;
    var
      TempClass: TWndClass;
      SysMenu: HMenu;
    begin
      if not FHandleCreated and not IsConsole then
      begin
        FObjectInstance := MakeObjectInstance(WndProc);
        if not GetClassInfo(HInstance, WindowClass.lpszClassName, TempClass) then
        begin
          WindowClass.hInstance := HInstance;
          if Windows.RegisterClass(WindowClass) = 0 then
            raise EOutOfResources.Create(SWindowClass);
        end;
        FHandle := CreateWindow(WindowClass.lpszClassName, PChar(FTitle),
          WS_POPUP or WS_CAPTION or WS_CLIPSIBLINGS or WS_SYSMENU
          or WS_MINIMIZEBOX,
          GetSystemMetrics(SM_CXSCREEN) div 2,
          GetSystemMetrics(SM_CYSCREEN) div 2,
          0, 0, 0, 0, HInstance, nil);
        FTitle := '';
        FHandleCreated := True;
        SetWindowLong(FHandle, GWL_WNDPROC, Longint(FObjectInstance));
        if NewStyleControls then
        begin
          SendMessage(FHandle, WM_SETICON, 1, GetIconHandle);
          SetClassLong(FHandle, GCL_HICON, GetIconHandle);
        end;
        SysMenu := GetSystemMenu(FHandle, False);
        DeleteMenu(SysMenu, SC_MAXIMIZE, MF_BYCOMMAND);
        DeleteMenu(SysMenu, SC_SIZE, MF_BYCOMMAND);
        if NewStyleControls then DeleteMenu(SysMenu, SC_MOVE, MF_BYCOMMAND);
      end;
    end;在这一句里
    FHandle := CreateWindow(WindowClass.lpszClassName, PChar(FTitle),
          WS_POPUP or WS_CAPTION or WS_CLIPSIBLINGS or WS_SYSMENU
          or WS_MINIMIZEBOX,
          GetSystemMetrics(SM_CXSCREEN) div 2,
          GetSystemMetrics(SM_CYSCREEN) div 2,
          0, 0, 0, 0, HInstance, nil);
    这说明,fhandle(就是application.handle属性所读写的字段)是由createwindow返回的,也就是说,它是窗口句柄而不是程序实例句柄,程序实例句柄是HInstance
    还有这一句
    SendMessage(FHandle, WM_SETICON, 1, GetIconHandle);
    这说明程序窗口上的小图标是显示在application.handl窗口上的
    tapplication.wndproc里有个子程序
    procedure Default;
      begin
        with Message do
          Result := DefWindowProc(FHandle, Msg, WParam, LParam);
      end;
    ...
    with Message do
          case Msg of
            WM_SYSCOMMAND:
              case WParam and $FFF0 of
                SC_MINIMIZE: Minimize;
                SC_RESTORE: Restore;
              else
                Default;  
              end;
    .....
    说明处理消息的窗口是tapplication.handle的窗口tform.handle是从twincontrol.handle里继承下来的Use the Handle when making Windows API function calls that requires a window handle.
    同样是窗口句柄,到底和tappliction.hanle有什么不同,就不清楚了.以上是本人一点愚见,请大家指正
      

  34.   

    不要争论了,看看Application.Handle的用法就明白了。实例一利用Delphi实现系统状态栏图标[ 作者: 小逗逗   添加时间: 2001-9-25 9:19:58 ]
     下面以一个具体的例子,详细介绍一下利用Delphi实现系统状态栏图标的步骤和方法。 1.创建一个应用程序,在主窗体上增加一个TpopupMenu组件。并为该弹出选单组件增加选单项Exit,标题为“退出”。 2.在Uses中添加ShellAPI,因为在系统状态栏中增加图标时需调用ShellAPI中的函数Shell_NotifyIconA。该函数需要两个参数,其中一个是TnotifyIconDataA结构,需在主窗体中增加TnotifyIconDataA类型的全局变量ntida。 3.定义消息mousemsg,并编写主窗体的mousemessage消息处理函数,此函数说明在图标上用鼠标左键单击时,会打开应用程序窗口;用鼠标右键单击时,会弹出一个选单。 下面给出步骤2和3的实现代码: unit Unit1;
    interface
    uses
    Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
    StdCtrls, ExtCtrls, Menus, shellapi;
    const
    mousemsg = wm_user + 1; //自定义消息,用于处理用户在图标上点击鼠标的事件
    iid = 100; //用户自定义数值,在TnotifyIconDataA类型全局变量ntida中使用
    type
    TForm1 = class(TForm)
    ......
    private
    //自定义消息处理函数,处理鼠标点击图标事件
    procedure mousemessage(var message: tmessage); message mousemsg;
    public
    { Public declarations }
    end;
    var
    Form1: TForm1;
    ntida: TNotifyIcondataA;
    //用于增加和删除系统状态图标
    implementation
    {$R .DFM}
    procedure TForm1.mousemessage(var message: tmessage);
    var
    mousept: TPoint; //鼠标点击位置
    begin
    inherited;
    if message.LParam = wm_rbuttonup then begin //用鼠标右键点击图标
    getcursorpos(mousept); //获取光标位置
    popupmenu1.popup(mousept.x, mousept.y);
    //在光标位置弹出选单
    end;
    if message.LParam = wm_lbuttonup then begin //用鼠标左键点击图标
    //显示应用程序窗口
    ShowWindow(Handle, SW_SHOW);
    //在任务栏上显示应用程序窗口
    ShowWindow(Application.handle, SW_SHOW);
    SetWindowLong(Application.Handle, GWL_EXSTYLE,
    not (GetWindowLong(Application.handle, GWL_EXSTYLE)
    or WS_EX_TOOLWINDOW AND NOT WS_EX_APPWINDOW));
    end;
    message.Result := 0;
    end 4.编写FormCreate的代码如下: procedure TForm1.FormCreate(Sender: TObject);
    begin
    ntida.cbSize := sizeof(tnotifyicondataa); //指定ntida的长度
    ntida.Wnd := handle; //取应用程序主窗体的句柄
    ntida.uID := iid; //用户自定义的一个数值,在uCallbackMessage参数指定的消息中使
    ntida.uFlags := nif_icon + nif_tip + nif_message;//指定在该结构中uCallbackMessage、hIcon和szTip参数都有效
    ntida.uCallbackMessage := mousemsg;
    //指定的窗口消息
    ntida.hIcon := Application.Icon.handle;
    //指定系统状态栏显示应用程序的图标句柄
    ntida.szTip := 'Icon';
    //当鼠标停留在系统状态栏该图标上时,出现该提示信息
    shell_notifyicona(NIM_ADD, @ntida);
    //在系统状态栏增加一个新图标
    end; 5.编写Tform1.OnClose的代码如下: procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
    begin
    Action := caNone; //不对窗体进行任何操作
    ShowWindow(Handle, SW_HIDE); //隐藏主窗体
    //隐藏应用程序窗口在任务栏上的显示
    ShowWindow(Application.Handle, SW_HIDE);
    SetWindowLong(Application.Handle, GWL_EXSTYLE,
    GetWindowLong(Application.handle, GWL_EXSTYLE)
    or WS_EX_TOOLWINDOW AND NOT WS_EX _APPWINDOW);
    end; 6.编写Exit代码如下: 当用户点击Exit时实现完全退出应用程序。具体代码如下: procedure TForm1.ExitClick(Sender: TObject);
    begin
    //为ntida赋值,指定各项参数
    ntida.cbSize := sizeof(tnotifyicondataa);
    ntida.wnd := handle;
    ntida.uID := iid;
    ntida.uFlags := nif_icon + nif_tip + nif_message;
    ntida.uCallbackMessage := mousemsg;
    ntida.hIcon := Application.Icon.handle;
    ntida.szTip := 'Icon';
    shell_notifyicona(NIM_DELETE, @ntida);
    //删除已有的应用程序图标
    Application.Terminate;
    //中断应用程序运行,退出应用程序
    end 通过以上步骤,我们即可用Delphi轻松实现系统状态栏图标。 实例二全面禁止WINDOWS 
     
     许昭鹏 
    诸位朋友,你是否曾经有过全面禁止Windows的想法呢?就是诸如禁止Windows桌面、任务栏(包括工具栏的快速启动区域、右下角的通知区域、开始按钮、任务按钮等)、系统按键(包括“Ctrl+Alt+Del”、“Alt+Tab”、“Ctrl+Esc”、“Start-button”等等)、屏幕保护,还有最后的禁止关机。禁止就是不能对它们进行操作,你要是不愿意禁止,你还可以隐藏,把这些统统隐藏起来。要禁止桌面、任务栏必须知道,当桌面的背景图片刚刚显现,注意这时的屏幕是没有桌面图标和任务栏的,也就是说,它们都是在系统启动后才装入系统的,并不是系统的核心部分。通过对系统当前所有窗体的搜索可以知道,它们都是窗体 (当然,并不是普通的窗体),且都拥有自己的句柄,这样,我们就可以用ShowWindow(Wnd, SW_HIDE)来隐藏它们,或者用EnableWindow(Wnd, False)来禁止它们,是不是很简单。关键是要获得它们的句柄,这可以用FindWindow获得,而用FindWindow必须知道所找窗体的类名。下面先列出我们要用到的类名:Shell_TrayWnd 任务栏整条TrayNotifyWnd 任务栏的右下角通知区域Button 任务栏上的开始按钮ReBarWindow32 任务栏的工具栏和任务按钮TrayClockWClass 通知区域的小时钟ShellDll_DefView 桌面图标Progman 程序管理器1. 禁止/隐藏整条任务栏
    procedure TForm1.Button1Click(Sender: TObject);Var Wnd: THandle;beginWnd:= FindWindow('Shell_TrayWnd', nil);//用下面这一句实现隐藏if Wnd <> 0 then ShowWindow(Wnd, SW_HIDE);//用下面这一句实现禁止if Wnd <> 0 then EnableWindow(Wnd, False);end;禁止和隐藏最好只用一个,因为隐藏了,你无处去按,等于禁止;禁止了,失去了作用,藏不藏都无关紧要。最后别忘了恢复正常必须用ShowWindow(Wnd, SW_SHOW)和EnableWindow(Wnd, True)。注:以下2~6只列出如何使用FindWindow2. 隐藏任务栏的右下角通知区域
    Wnd:= FindWindow('Shell_TrayWnd', nil);Wnd:=FindWindowEx(Wnd, HWND(0),'TrayNotifyWnd', nil);3. 禁止/隐藏任务栏上的开始按钮
    Wnd:=FindWindow('Shell_TrayWnd', nil);Wnd:=FindWindowEx(Wnd, HWND(0),'Button', nil);4. 禁止/隐藏任务栏的工具栏和任务按钮
    Wnd:=FindWindow('Shell_TrayWnd', nil);Wnd:=FindWindowEx(Wnd, HWND(0), 'ReBarWindow32', nil);5. 隐藏通知区域的小时钟
    Wnd:=FindWindow('Shell_TrayWnd', nil);Wnd:=FindWindowEx(Wnd, HWND(0), 'TrayNotifyWnd', nil);Wnd:=FindWindowEx(Wnd, HWND(0),'TrayClockWClass', nil);6. 禁止/隐藏桌面图标
    Wnd:=FindWindow('Progman', nil);Wnd:=FindWindowEx(Wnd, HWND(0), 'ShellDll_DefView', nil);以上2~6可以直接代入1的Button1Click过程中,以实现相应的功能。并且注意2和5只能隐藏,不能禁止(不信?你可以试试,没有危险的,Hehe)。7. 在任务栏中隐藏本程序的按钮
    Var XWndLong: integer;beginXWndLong:= GetWindowLong(Application.Handle,GWL_EXSTYLE);ShowWindow(Application.Handle,SW_HIDE); //必须先隐藏程序窗口SetWindowLong(Application.Handle,GWL_EXSTYLE, XWndLong or WS_EX_TOOLWINDOW and not WS_EX_APPWINDOW or WS_EX_TOPMOST);ShowWindow(Application.Handle, SW_SHOW); //设置按钮隐藏后再恢复窗口end;恢复按钮显示用SetWindowLong(Application.Handle,GWL_EXSTYLE, XWndLong);并且仍然需要两个ShowWindow,将Application.Handle改成其它程序的句柄还可以隐藏其它程序。8. 从关闭程序对话框(按“Ctrl+Alt+Del”时出现)中隐藏本程序:
    先在程序中的implementation前加上这么一句function RegisterServiceProcess(dwProcessID,dwType:integer):integer; stdcall;external 'KERNEL32.DLL'; //调用系统的外部API函数然后隐藏用RegisterServiceProcess(GetCurrentProcessID, 1);恢复显示用RegisterServiceProcess(GetCurrentProcessID, 0);9. 禁止系统键(包括“Ctrl+Alt+Del”、“Alt+Tab”、“Ctrl+Esc”、“Start-button”等等)
    procedure TForm1.Button1Click(Sender:TObject);var pv: integer;beginSystemParametersInfo(SPI_SCREENSAVERRUNNING,1, @pv,0);end恢复用SystemParametersInfo(SPI_SCREENSAVERRUNNING,0, @pv,0);10. 禁止屏幕保护
    先增加一过程如下:procedure TForm1.AppMessage(var msg:TMsg; var Handled: boolean);beginif(msg.message = wm_SysCommand)and(msg.wParam = sc_ScreenSave)thenbeginHandled:= True; //禁止屏幕保护MessageBeep(0); //加入自己的处理MessageDlg('Screen-saver is Disabled!', mtWarning,[mbOk],
      

  35.   

    To netlib(河外孤星):
    “请问刚才说application.handle就是任务栏上的那个窗体的handle,那么是不是在VC中写的时候也要创建两个呢(对不起,我对VC不熟:));”没错,只要是Windows下的程序,正常情况下都会有两个句柄,一个是程序Application的(hInstance),一个是程序中的主form的(由CreateWindow产生的)。“有人说application.handle是应该程序的handle,那么请问应用程序(也就是进程)怎么会有handle呢?”呵呵,在Windows里面是需要区分每一个运行的程序的,而每一个程序Windows都会给一个名字,用以区分不同程序的接受或是发送的消息(这只是名字的一种用处),这个名字就是句柄。而每一个程序中又会有好几个窗口和控件,同样,Windows或者说是这个程序也需要识别这几个窗口和控件,于是也给他们起名字,也就是句柄。这样说你能明白句柄的实质了吗?(呵呵,这是我看完书后自己的归纳,如果不对,还请高手指教:))“我是没有搞清楚才提问的?不会和大家开这种玩笑,:)”这样最好了!呵呵!
      

  36.   

    楼上的,进城怎么会没有Handle呢?
      

  37.   

    To:darzui(牛肉饭)   很感谢你!因为你的提醒,发现了我的错误。
       的确,在这里Application不是程序的句柄,如果大家看一下TApplication.Create的源代码就会发现里面有一个MainInstance,看了它的帮助后我才知道这个才是Windows为每个程序分配的程序句柄,而其实Application才是主窗口句柄。而楼主所说的Mainform.Handle只是这个Windows窗口Application的一个子窗口(在Programming Windows里是这么理解的)!所以会不一样!!!   说的有点乱,让我理一下头绪。。呵呵,自己都晕了。   一般的Win32程序都是在WinMain函数里面创建一个窗口类wndclass,然后注册,在这个上面再创建窗口CreateWindow,从而获得主Form的句柄。如果是Dll,这个函数应该就不会有。
       似乎在Delphi里面这个wndclass被取消了,然后直接获得一个MainInstance(在System里有它的得到方法,看不懂,呵呵),同时利用这个MainInstance就可以创建一个TApplication的实例,这个TApplication的实例Application就是原来的CreateWindow创建出来的窗口,只不过这个实例的功能更强大,因此整个程序的消息的维护全部都是在Application里进行的,然后在它的基础上再创建一个类似于MainForm的窗体,供我们编程使用。
        不知道这样说大家能不能清楚一点?还希望更多高手看看我说的对不对!呵呵!多谢!    大家可以做个实验,随便新建一个项目,然后添加两个Watch:MainInstance和Application.Handle,就能知道何时有的这两个句柄。但是奇怪的是,发现不到产生这两个句柄的语句,看来只能通过看Cpu的那种调试方式才能知道了。
        建议看看TApplication的帮助吧,挺有用的,还有它的代码!
      

  38.   

    To:darzui(牛肉饭)   很感谢你!因为你的提醒,发现了我的错误。
       的确,在这里Application不是程序的句柄,如果大家看一下TApplication.Create的源代码就会发现里面有一个MainInstance,看了它的帮助后我才知道这个才是Windows为每个程序分配的程序句柄,而其实Application才是主窗口句柄。而楼主所说的Mainform.Handle只是这个Windows窗口Application的一个子窗口(在Programming Windows里是这么理解的)!所以会不一样!!!   说的有点乱,让我理一下头绪。。呵呵,自己都晕了。
       一般的Win32程序都是在WinMain函数里面创建一个窗口类wndclass,然后注册,在这个上面再创建窗口CreateWindow,从而获得主Form的句柄。如果是Dll,这个函数应该就不会有。
       似乎在Delphi里面这个wndclass被取消了,然后直接获得一个MainInstance(在System里有它的得到方法,看不懂,呵呵),同时利用这个MainInstance就可以创建一个TApplication的实例,这个TApplication的实例Application就是原来的CreateWindow创建出来的窗口,只不过这个实例的功能更强大,因此整个程序的消息的维护全部都是在Application里进行的,然后在它的基础上再创建一个类似于MainForm的窗体,供我们编程使用。
        不知道这样说大家能不能清楚一点?还希望更多高手看看我说的对不对!呵呵!多谢!
        
        大家可以做个实验,随便新建一个项目,然后添加两个Watch:MainInstance和Application.Handle,就能知道何时有的这两个句柄。但是奇怪的是,发现不到产生这两个句柄的语句,看来只能通过看Cpu的那种调试方式才能知道了。
        建议看看TApplication的帮助吧,挺有用的,还有它的代码!
    刚刚不知道为什么那个样子,重新排了一下版。
      

  39.   

    TO:I_am_zealot(狂战士)]  啊?我没说进程没有句柄阿,进程的句柄不就是程序的句柄嘛?不知道我这样说是否有错?
      

  40.   

    对于前面几位的,我同意huhe的看法。
    cpls(温柔一刀):说法不对。xzgyb(老达摩) :的代码,可以显示隐含的那个窗口,说明了tapplicaton.handle本质是一个窗口句柄。dearmite(我是笨笨!) :没有说明问题的本质。
    zswang(伴水): 你帖的我也知道,但并没有说明我的问题。
    关于aaronzhang(风不息)和darzui(牛肉饭)你们所谈论的基本正确,
    但我觉得几句可以说清楚的问题,你们用了半天,在一个,请回答问题的时候使用专业术语,不要举那些很搞笑的句子。现在根据以上同仁的看法和代码,
    通过我的测试,看出来,application.handle的本质就是delphi内部一个隐藏的窗体,
    mainfm.handle就是主form的handle,
    也就是说delphi在创建一个应用程序时会创建两个form.
    关于上面提到的hInstance,也就是delphi中的mainInstance,是进程的句柄。
    (对不起,刚我在上面出现手误).
    现在的问题是,delphi为什么要用一个隐含的窗口呢,这样不是浪费系统资源吗?
    用主form.handle或hinstance代替不就可以了???
      

  41.   

    呵呵,我来总结一下
        很多人在制造垃圾,搞得大家都没了看帖子和研究问题的兴致:
        有些人从网上或Delphi源代码找来不知道有没有关系的长篇大论,就往这里贴,如:Borlandor(五角▲大民) ,darzui(牛肉饭) ,zswang(伴水) ,surfguy(冲浪小子) ,I_am_zealot(狂战士) , LXJ2001(lxj) ……,他们的目的是得分,我看应该让他们失分;
        有些人明知道自己搞不清楚,还长篇大论乱说,混淆视听,误人子弟,如:bill_lasker,zhuliang1981,cg1120(代码最优化,cpls(温柔一刀) ,surfguy(冲浪小子) ,zklcy(失落的人) ,dearmite(我是笨笨!) ,aaronzhang(风不息) ……热心助人是好的,但是光有热心是不够的,帮不了忙,还越帮越忙,劝你们以后多看贴学习,少发言制造谬误;
        还有瞎凑热闹的,不辨是非,盲目跟风,如:I_am_zealot(狂战士) ,S_caijing(star) ,romeo00001(quick) ,Blank_(拂晓清风)……制造了垃圾,助长了谬误;
        当然,还是有好人的,如: xzgyb(老达摩) 给出了方法,证明了Application.Handle也是个普通的窗口句柄,可以显示出来;mv66_ren(didi[迪迪]) 实事求是;……    回答了这么多贴,没有解决多少实际问题,反倒引出了更多的谬误,这里,我总结一下,一正视听:
        Delphi中新建的普通工程,一开始就会创建两个窗口,一个的句柄是Application.Handle,是Windows系统承认的代表进程的主窗口,显示在任务栏上的指的就是它,可用xzgyb(老达摩) 的方法把它显示出来,平时藏在幕后,主要有代表进程、作为进程的其他窗口的父窗口等作用;MainForm.Handle是Application.Handle的第一个子窗口,就象家里的大儿子一样,因为其父藏在幕后,所以它就站出来当老大,:) 包括MainForm在内的子窗口,它们都是工作窗口,就是让你在上面画你想画的、把它当容器,干活用的。
        新的问题是:Delphi这么搞有多大的必要性,只搞一个窗口不够用吗?何必浪费windows资源呢?
      

  42.   

    TO: netlib(河外孤星) 
    “但我觉得几句可以说清楚的问题,你们用了半天,在一个,请回答问题的时候使用专业术语,不要举那些很搞笑的句子。”呵呵,几句?你觉得这个问题很简单就能说清楚并让别人明白是吗?那对不起,我搞错了,我本来想到大家可能水平都不高,需要一起提高。现在才发现原来提问题的人就是能正确解答问题的人(而且能解答的很好,几句就行了!),以在下的智商实在是不配为这个问题做答啊。我本来就不是什么高手,所以不会什么时候都使用专业术语(也许你是,你可以)。搞笑我就不说了,我这个人本来就挺搞笑的,也很无聊。
    觉得你好像非常有自信,还有点自负,似乎更加愿意指点别人:)这样的人我在现实中实在是无服交往,现在也就这么着吧:)呵呵,你提的最后一个问题可以看出你对Windows编程还不是很了解(至少最基础是怎么构造的不了解),这个问题不是太难理解(也可能是我高估自己觉得已经明白了,呵呵)。以你的能力我觉得要明白也就是个时间问题了。
    另:1、你的理解似乎还是有问题。不会简单就是一个隐藏的窗体吧?
        2、你好像是个mm吧?呵呵,没什么,就是看说话的语气像。