在Delphi中我调用setwindowlong(applition.handle,gwl_exstyle,      
ws_ex_toolwindow)可以让Delphi程序不在任务栏中显示,我现在在此程序中调用   WinExec(Pchar('路径名',SW_MINIMIZE))启动另一程序,并用FindWindow(nil,'程序名')取得其窗口的句柄,但我再次调用setwindowlong(另一窗口句柄,gwl_exstyle,ws_ex_toolwindow)时,该程序在任务栏上却仍能找到,而该程序窗口右上角的最小化和最大化不见了,只剩下关闭程序('X')这一项。      
    附setwindowlong的api资料:      
    函数功能:该函数改变指定窗口的属性。函数也将在指定偏移地址的一个32位值存入窗口的额外窗口存。      
    函数原型:LONG    SetWindowLong(HWN    hWnd,int    nlndex.LONG    dwNewLong);      
    参数:hWnd:窗口句柄,及间接声明的该窗口所属的类。      
    nlndex:给出了要设置的值的零起点的偏移地址。有效值为从0到额外窗口存储空间的字节数一4。     测试代码:  
procedure  TForm1.Button1Click(Sender:  TObject);  
var  hwndcalculator:  HWND;  
begin  
   hwndcalculator  :=  FindWindow(nil,'计算器');  
   SetWindowLong(hwndcalculator,GWL_EXSTYLE,WS_EX_TOOLWINDOW);  
end;      
   对于setwindowlong(HWN    hWnd,int    nlndex.LONG    dwNewLong)的nlndex参数的说明我看不明白(我是个新手),我试着换成别的参数但好像都不行。另外使用setwindowlong我可以让我的delphi程序不在任务栏上显示,而且在获得了窗口的句柄之后我可以关闭计算器。  
   请问这段代码的功能能不能实现?如果哪位大虾知道的话请指教,多谢!!!  

解决方案 »

  1.   

    顺便想问一下怎样让外部程序设置为showmodal模式,不关闭外部程序,不能执行主程序的其他模块
      

  2.   

    procedure TForm1.Button2Click(Sender: TObject);
    var  hwndcalculator:  HWND;
    begin
       hwndcalculator  :=  FindWindow(nil,'计算器');
       SetWindowLong(hwndcalculator,GWL_HWNDPARENT,WS_EX_TOOLWINDOW);
    end;要分!~~
      

  3.   

    多谢楼上!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
       
        zhguiqiang你的问题我想了一下,如果在同一个程序中的话可以这么做:
    procedure TForm1.Button1Click(Sender: TObject);
    begin
      enablewindow(handle,false);//窗口1不可用
    form2.show;
    end;procedure TForm2.FormClose(Sender: TObject; var Action: TCloseAction);
    begin
      enablewindow(form1.handle,true);//可用
    end;     如果是两个Delphi程序的话可以用FindWindow取得另一程序窗口的句柄,再用ShowWindow显示另一程序;用同样的办法在另一Delphi程序中添加相应代码。
         如果另一个不是Delphi程序的话,那我就没办法了,你最好发个帖问一下。