...
var
  Form1: TForm1;
  function EnumThreadWndProc(Ah:hwnd;AForm:lParam):boolean;stdcall;
...function EnumProc(Ah:hwnd;AF:lParam):boolean;
begin
  SendMessage(Ah,WM_CLOSE,0,0);
  Result:=True;
end;procedure TForm1.Button1Click(Sender: TObject);
var
  Eh,pid:THandle;
begin
  Eh:=FindWindow(nil,'Unit1.pas - 记事本');
  GetWindowThreadProcessId(Eh,@pid);
  EnumThreadWindows(pid,@EnumProc,0);
end;//F7跟踪到这就停了,不会调用EnumProc窗口句柄Eh和进程句柄pid都能找到,但就是不会调用EnumProc,我的用法错在哪里,望高手解答!请不要随便在网上复制些不能解决我问题的答案给我,谢谢!

解决方案 »

  1.   

    var 
        Eh,pid:THandle;
    这俩变量提到外面去
      

  2.   


    var
      snap  : THandle;
      ThreadStruct: TThreadEntry32;
    begin
      snap := CreateToolHelp32Snapshot(TH32CS_SNAPTHREAD, FindWindow(nil,'Unit1.pas   -   记事本'));
      if snap <> 0 then
      try
        ThreadStruct.dwSize := sizeOf(TThreadEntry32);
        if Thread32First(snap, ThreadStruct) then
          repeat
            if ThreadStruct.th32OwnerProcessID = FHandle then
              EnumThreadWindows(ThreadStruct.th32ThreadID, @EnumThreadProc, Integer(AList));
          until not Thread32Next(snap, ThreadStruct);
      finally
        CloseHandle(snap);
      end;
    end;
      

  3.   

    哦,但改了还是不关闭我想关闭的 Unit1.pas - 记事本 这个窗口,而是把所有窗口都关闭,EnumThreadWindows不是只枚举pid对应的窗口吗?
      

  4.   

    回2楼:你的FHandle和AList未定义啊,我菜,不知道怎么办!
      

  5.   

    回5楼:
    ... 
    var 
        Form1:   TForm1; 
        Eh,pid:THandle;
    ... procedure   TForm1.Button1Click(Sender:   TObject);
    function   EnumProc(Ah:hwnd;AForm:lParam):boolean;stdcall;
    begin 
        SendMessage(Ah,WM_CLOSE,0,0); 
        Result:=True; 
    end;    
    begin 
        Eh:=FindWindow(nil,'Unit1.pas   -   记事本'); 
        GetWindowThreadProcessId(Eh,@pid); 
        EnumThreadWindows(pid,@EnumProc,0); 
    end;
    是这样写吗?参数怎么错了?好象不对啊,能说得详细点吗?
      

  6.   


    var
      h : HWND;
      FHandle : DWORD;
      snap  : THandle;
      ThreadStruct: TThreadEntry32;
    begin
      h := FindWindow(nil,'Unit1.pas   -   记事本');
      GetWindowThreadProcessId(h, @FHandle); //此处取得的是进程ID,而非线程ID
      snap := CreateToolHelp32Snapshot(TH32CS_SNAPTHREAD, FHandle);
      if snap <> 0 then
      try
        ThreadStruct.dwSize := sizeOf(TThreadEntry32);
        if Thread32First(snap, ThreadStruct) then
          repeat //枚举所有线程
            if ThreadStruct.th32OwnerProcessID = FHandle then //如果线程所属进程的ID=需要找的进程ID
              EnumThreadWindows(ThreadStruct.th32ThreadID, @EnumThreadProc, 0);//枚举线程窗口
          until not Thread32Next(snap, ThreadStruct);
      finally
        CloseHandle(snap);
      end;
    end;