已经知道一个可执行文件的名字和路径,怎么获取它的句柄呀,我通过OperProcess获取的不行呀,我要对这个文件发WM_CLOSE消息(因为某种原因只能这么做),该程序没有反应

解决方案 »

  1.   

    如果是进程句柄,要用API函数TerminateProcess结束进程
    WM_CLOSE只对窗口句柄生效
      

  2.   

    var
       Exehandle: THandle;
       s : String;
    begin
       s := '进程名';
          Exehandle:= OpenProcess(1,BOOL(0),StrToInt(s));
          TerminateProcess(Exehandle,0);
    end;
    上面的应该可以,
    不行的话你可以试试消息
    HWND h:=::FindWindow(0,"窗口名称");
    if (h<>nil)then
      PostMessage(h,WM_CLOSE,0,0);
      

  3.   

    是要把一个正在运行的程序关掉么
    只知道exename的话那就枚举所有进程
    如果用delphi 8的话就简单了
    .net类库中有getprocessbyname方法
      

  4.   

    to bobdylan(风) 我就是要对主窗体发WM_CLOSE消息
    to  ysai(大海呀,真TM的大) 由于某种原因不能用TerminateProcess
    to longchaohui(阿龙) 窗体类名和窗体名都有可能变,他们不确定
    to  master_jt(天堂狗) 我的是7,我能获取进程列表,但没办法得到它的句柄
      

  5.   

    楼主没理解进程与窗口的关系
    进程不一定有界面,也就是不一定有窗口
    进程必然有一个或一个以上线程,线程可能拥有窗口
    OperProcess是取得进程句柄,而WM_CLOSE是发向窗口句柄......
    就算可以通过进程句柄取得窗口句柄(如果进程有窗口的话,EnumThreadWindows可能有点帮助),一般也是多个窗口,你既不知道窗口的类名又不知道窗口的标题,你怎么知道往哪个窗口发消息?
      

  6.   

    那怎么办,实际上这个程序是我打开的,调用ShellExecute,其它方法也行,我想对主窗体发Close消息
      

  7.   

    longchaohui(阿龙) 
    Exehandle:= OpenProcess(1,BOOL(0),StrToInt(s));报错呀,字符串无法转换成整型呀
      

  8.   

    ysai(大海呀,真TM的大) 说得很对,进程ID和窗口句柄不是一个东东,你试试,openWindow()
      

  9.   

    是EnumWindows(@EnumWindowsProc, 0)
      

  10.   

    to  bobdylan(风) 我用EnumWindows怎么能判断是我不是我要的窗体呀,现在我们知道的信息只有程序名和路径,因为这个程序是我用ShellExecute来启动的,现在想定时启动,定时关闭,要怎么办,大家 想想办法呀,只有几个小时的时间了,谢谢
      

  11.   

    刚才CSDN出错,在DFW上已经回答了
      

  12.   

    非要shellexecute吗,这个函数虽然能执行程序,但好像无法保存新启动进程的信息,所以用createprocess吧。var
      aProcess: Cardinal;implementation{$R *.dfm}procedure TForm1.Button1Click(Sender: TObject);
    var
      StartupInfo: TStartupInfo;
      ProcessInfo: TProcessInformation;
    begin
      FillChar(StartupInfo, SizeOf(StartupInfo), #0);
      StartupInfo.cb := SizeOf(StartupInfo);
      StartupInfo.dwFlags := STARTF_USESHOWWINDOW;
      StartupInfo.wShowWindow := SW_SHOWNORMAL;
      if CreateProcess(nil, 'notepad.exe', nil, nil, false, Create_new_console or
        Normal_priority_class, nil, nil, StartupInfo, ProcessInfo) then
        aProcess := processinfo.hProcess;
    end;procedure TForm1.Button2Click(Sender: TObject);
    begin
      TerminateProcess(aProcess, 0)
    end;
      

  13.   

    楼主用我的方法应该没问题,不知道有没有赶上你的时间,老天爷,阿弥陀佛,上天阿,我佛慈悲,上帝,阿门,oh,my god!
      

  14.   

    to progray(千重劫)你这不是把线程给终止了吗?我是想给它的主窗体发WM_CLOSE,由于某种原因不能像你那个做
      

  15.   

    哦,对不起,题目没认真看。不过进程未必有窗口阿,比如控制台程序哪里有自己的窗口阿?有窗口的话,怎么算主窗口呢,呵呵,好像没这个概念阿。要做个通用的恐怕不行。这个东西,我能力有限,实在帮不了什么忙了。另外,能问问你,为什么只能用WM_CLOSE结束它吗?难道那个程序WM_CLOSE结束的时候要做什么处理,你不可以代替它处理吗?
      

  16.   

    WM_CLOSE 只对窗口生效的啊.你的结束进程吗?!
    你可以用 TerminateProcess 啊