接上面的帖子 通过查找句柄点击的方法  已经完成了 UUC.exe再 show模式下的安装 可是 换成hide的时候 却是无法隐藏了 郁闷 
贴出我简单写的代码 ===
program Project1;uses
  Forms,shellapi,windows,messages,dialogs;
  var handleuuc:hwnd;
      handleuuc1:hwnd;
      handleuuc2:hwnd;
      handleuuc3:hwnd;
      handleuuc4:hwnd;
      handleuuc5:hwnd;
begin
   Application.Initialize;
   ShellExecute(0, 'open','uuc.exe','-s',nil, SW_hide);
    //ShellExecute(0, 'open','uuc.exe','-s',nil, SW_hide);
   sleep(1000);
   handleuuc:=findwindow(nil,'UUSee 网络电视 2008') ;
   if handleuuc<>0 then
   begin
   handleuuc1:=FindWindowEx(handleuuc,0,nil,'下一步(&N) >')  ;
   sendmessage(handleuuc1,   WM_LBUTTONDOWN,   MK_LBUTTON,   0);
   sendmessage(handleuuc1,   WM_LBUTTONUP,   MK_LBUTTON,   0);   //点击下一步
   sleep(1000);
   handleuuc2:=findwindowEx(handleuuc,0,nil,'我同意(&I)') ;
   if handleuuc2<>0 then
   begin
   sendmessage(handleuuc2,   WM_LBUTTONDOWN,   MK_LBUTTON,   0);
   sendmessage(handleuuc2,   WM_LBUTTONUP,   MK_LBUTTON,   0);//点击同意
   handleuuc3:=findwindowex(handleuuc,0,nil,'下一步(&N) >') ;
    sleep(1000);
    handleuuc4:=findwindowex(handleuuc,0,nil,'安装(&I)')  ;
    sleep(300);
   if handleuuc4<>0 then
   begin
   sendmessage(handleuuc4,   WM_LBUTTONDOWN,   MK_LBUTTON,   0);
   sendmessage(handleuuc4,   WM_LBUTTONUP,   MK_LBUTTON,   0);
   //showmessage('找到句柄handleuuc3');
   sleep(18000);
   handleuuc5:=findwindowex(handleuuc,0,nil,'完成(&F)')  ;
   if handleuuc5<>0 then begin
   sendmessage(handleuuc5,   WM_LBUTTONDOWN,   MK_LBUTTON,   0);
   sendmessage(handleuuc5,   WM_LBUTTONUP,   MK_LBUTTON,   0);
   end
   else
   sleep(300);
   handleuuc5:=findwindowex(handleuuc,0,nil,'完成(&F)')  ;
   sendmessage(handleuuc5,   WM_LBUTTONDOWN,   MK_LBUTTON,   0);
   sendmessage(handleuuc5,   WM_LBUTTONUP,   MK_LBUTTON,   0);   end
   else
   showmessage('not finded handle4');
   end
   else
   showmessage('未找到同意句柄');
   end
   else
   begin
   showmessage('未找到handleuuc句柄');
   end;
   Application.Run;
end.
====
注  用showmessage()  是为了测试程序的流程问题 
现在该如何操作呢  下面加上命令 就无法隐藏打开  uuc.exe了 我加上了 调用shellapi  -s参数 了 可还是不行  

解决方案 »

  1.   

    换成hide的时候,handleuuc:=findwindow(nil,'UUSee 网络电视 2008')是不可能返回正确值的
      

  2.   

       以前研究过这方面的东西,在程序中调用另一个EXE,很好实现,但调用时隐藏原exe界面就有些不好实现了。虽然用API函数WinExec('exe文件名',SW_HIDE)时第二个参数指明为SW_HIDE隐藏,但因为原exe窗口模态等原因,仍然不能实现隐藏。只能再通过FindWindow查找到该窗口句柄,然后用SendMessage或ShowWindow再设置窗口隐藏,但这种方法并不好,因为是在窗口被打开后才又被隐藏的,这样窗口会跳出来闪一下,有点不完美。后来看了别人写的盗号程序和拦截提交等程序源码,我的进步很大,学会了使用各种消息钩子,于是钩住外部程序的show事件,用子类化的方法屏蔽掉它的显示。这样可以实现启动exe彻底隐藏了,但只要用到钩子,又要多出一个DLL文件出来,虽然我可以用动态加载DLL文件来实现自己的软件独立,但软件增大不少,而且我觉得用这种代码写软件太不爽,不够直接……到了今年,偶尔得到一篇详细介绍虚拟桌面的经典文章,于是兴致勃勃的钻研了一番,大功告成。我学会了虚拟桌面,这样就可以偷偷在用户机器上新开一个桌面来干任何事情,而用户只能看到自己的桌面,虚拟桌面他是看不到的,这样想做什么事就只有程序员自己知道了……
      

  3.   

    楼主你注意这个贴子:http://topic.csdn.net/u/20091217/11/086f53a5-8527-478e-99c7-6d2b6297e5dc.html另外我建议:不要向外部程序的按扭发送Click或WM_LBUTTONDOWN之类的单击消息,因为在通常情况下安装程序在多次点击下一步后开始正式安装时,该“下一步”按扭就是灰色的了,这里发送Click消息有时候仍然能点动灰色的按扭导致一些错误。当然,我是说通常情况下,也会有一些特殊的,比如“下一步”按扭在最后自动隐藏了而不是变灰(禁用状态),这种情况除外。建议向按扭发送VK_RETURN按扭消息。按扭如果是灰色就会自动不响应该消息,省去了自身判断的麻烦。要不然你还要用IsWindowEnabled这个api来判断按扭状态!