unit Unit1;interfaceuses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ExtCtrls, StdCtrls;type
  TForm1 = class(TForm)
    Timer1: TTimer;
    Button1: TButton;
    procedure Timer1Timer(Sender: TObject);
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;var
  Form1: TForm1;implementation{$R *.dfm}
  function GetButtonHandle(hwnd: Integer; lparam: Longint):Boolean; stdcall;
var
  buffer: array[0..255] of Char;
  buffer1: array[0..255] of Char;
begin
  Result := True;
  GetClassName(hwnd,buffer,256);
  if StrPas(Buffer)='Button' then
  begin
    GetWindowText(hwnd,buffer1,100);
    if buffer1 = '分析' then
    begin
      PInteger(lparam)^ := hwnd; 
      Result:=False;
    end;
  end;
end;//end of functionprocedure TForm1.Timer1Timer(Sender: TObject);   var
   ButtonHandle,WindowHandle:HWND;
begin
   //以下代码是为了得到“确定”按钮的句柄
   WindowHandle:=FindWindow(nil,'计算机管理');
   if WindowHandle<>0 then
   begin
       EnumChildWindows(WindowHandle,@GetButtonHandle,Integer(@WindowHandle));
       ButtonHandle := WindowHandle;
       //以下代码是为了模拟单击“确定”按钮
       if ButtonHandle<>0 then
       begin
             SendMessage(ButtonHandle,MOUSEEVENTF_LEFTDOWN,0,0);
             SendMessage(ButtonHandle,MOUSEEVENTF_LEFTUP,0,0);
       end;
   end;end;procedure TForm1.Button1Click(Sender: TObject);
  var
   ButtonHandle,WindowHandle:HWND;
begin
   //以下代码是为了得到“确定”按钮的句柄
   WindowHandle:=FindWindow(nil,'计算机管理');
   if WindowHandle<>0 then
   begin
       EnumChildWindows(WindowHandle,@GetButtonHandle,Integer(@WindowHandle));
       ButtonHandle := WindowHandle;
       //以下代码是为了模拟单击“确定”按钮
       if ButtonHandle<>0 then
       begin
             SendMessage(ButtonHandle,MOUSEEVENTF_LEFTDOWN,0,0);
             SendMessage(ButtonHandle,MOUSEEVENTF_LEFTUP,0,0);
       end;
   end;
end;end. 
 
为什么运行后,没有反映?有哪位高手,帮看看?
另外,我想实现,通过inputbox来输入指定汉字,然后通过枚举窗口查找哪些汉字。比如,当用迅雷下载的时候,当出现“下载完成100%”的时候,然后做一些事情,比如关机?

解决方案 »

  1.   

    哪我怎么联系你呀?
    mwy6544321
    我的qq:44665376
    你能加我吗?
      

  2.   

    还在吗?mwy6544321 
    我的qq:44665376 
      

  3.   

    FindWindow(nil,'计算机管理');        是干吗的?FindWindow的参数是窗口类名和窗口名称 如 'TForm1','Form1'
    而非窗口标题
      

  4.   

    第一个参数是类,没指定,nil,第二个参数是窗口标题-计算机管理
      

  5.   

    unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls;type
      TForm1 = class(TForm)
        Button1: TButton;
        procedure Button1Click(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
      end;var
      Form1: TForm1;implementation{$R *.dfm}
         uses CommCtrl;function TreeNodeGetNext( // 获得下一个节点
      mHandle: THandle;
      mTreeItem: HTreeItem
    ): HTreeItem;
    var
      vParentID: HTreeItem;
    begin
      Result := nil;
      if (mHandle <> 0) and (mTreeItem <> nil) then
      begin
        Result := TreeView_GetChild(mHandle, mTreeItem);
        if Result = nil then
          Result := TreeView_GetNextSibling(mHandle, mTreeItem);
        vParentID := mTreeItem;
        while (Result = nil) and (vParentID <> nil) do
        begin
          vParentID := TreeView_GetParent(mHandle, vParentID);
          Result := TreeView_GetNextSibling(mHandle, vParentID);
        end;
      end;
    end;  { TreeNodeGetNext }
      function   GetButtonHandle(hwnd:   Integer;   lparam:   Longint):Boolean;   stdcall;
    var
      buffer:   array[0..255]   of   Char;
      buffer1:   array[0..255]   of   Char;
    begin
      Result   :=   True;
      //PInteger(lparam)^   := 0;
      //showmessage(inttostr(lparam)); //
      GetClassName(hwnd,buffer,256);
      //ShowMessage(StrPas(Buffer));
      if strpas(Buffer)='Button' then  //
      begin
        GetWindowText(hwnd,buffer1,100);
        //ShowMessage(StrPas(buffer1));
        if strpas(buffer1) = '分析' then //
        begin
          PInteger(lparam)^   :=   hwnd;      Result:=False;
        end;
      end;
    end;//end   of   functionprocedure TForm1.Button1Click(Sender: TObject); var
      ButtonHandle,WindowHandle:HWND;
        vHandle: THandle;
      vItemCount: Integer;
      vBuffer: array[0..255] of Char;
      vProcessId: DWORD;
      vProcess: THandle;
      vPointer: Pointer;
      vNumberOfBytesRead: Cardinal;
      I: Integer;
      vItem: TTVItem;
      vTreeItem: HTreeItem;
       begin
      ///////Begin 获得计算机管理程序TreeView的句柄
      vHandle := FindWindow('MMCMainFrame', nil);
      if vHandle = 0 then Exit;
      vHandle := FindWindowEx(vHandle, 0, 'MDIClient', nil);
      if vHandle = 0 then Exit;
      vHandle := FindWindowEx(vHandle, 0, 'MMCChildFrm', nil);
      if vHandle = 0 then Exit;
      vHandle := FindWindowEx(vHandle, 0, 'MMCViewWindow', nil);
      if vHandle = 0 then Exit;
      vHandle := FindWindowEx(vHandle, 0, 'SysTreeView32', nil);
      if vHandle = 0 then Exit;
      ///////End 获得计算机管理程序TreeView的句柄  GetWindowThreadProcessId(vHandle, @vProcessId); // 获得窗体进程ID
      vProcess := OpenProcess(PROCESS_VM_OPERATION or PROCESS_VM_READ or
        PROCESS_VM_WRITE, False, vProcessId);
      vPointer := VirtualAllocEx(vProcess, nil, 4096, MEM_RESERVE or MEM_COMMIT,
        PAGE_READWRITE);
      try
        vItemCount := TreeView_GetCount(vHandle);
        vTreeItem := TreeView_GetRoot(vHandle);
        for I := 0 to vItemCount - 1 do
        begin
          with vItem do
          begin
            mask := TVIF_TEXT;
            cchTextMax := SizeOf(vBuffer);
            pszText := Pointer(Cardinal(vPointer) + SizeOf(vItem));
            hItem := vTreeItem;
          end;
          WriteProcessMemory(vProcess, vPointer, @vItem,
            SizeOf(vItem), vNumberOfBytesRead);
          SendMessage(vHandle, TVM_GETITEM, 0, lparam(vPointer));
          ReadProcessMemory(vProcess, Pointer(Cardinal(vPointer) + SizeOf(TLVItem)),
            @vBuffer[0], SizeOf(vBuffer), vNumberOfBytesRead);
          if SameText(vBuffer, '磁盘碎片整理程序') then // 通过节点文本确定
          begin
            SendMessage(vHandle, TVM_SELECTITEM, TVGN_CARET, Integer(vTreeItem)); // 选中该节点
            Exit;
          end;
          vTreeItem := TreeNodeGetNext(vHandle, vTreeItem);
        end;
      finally
        VirtualFreeEx(vProcess, vPointer, 0, MEM_RELEASE);
        CloseHandle(vProcess);
           WindowHandle:=FindWindow(nil,'计算机管理'); //
      if WindowHandle <> 0 then
      begin
        EnumChildWindows(WindowHandle,@GetButtonHandle,Integer(@WindowHandle));
        ButtonHandle   :=   WindowHandle;
        //以下代码是为了模拟单击“确定”按钮
        if   ButtonHandle <> 0   then
        begin
        //showmessage(inttostr(WindowHandle));
                 PostMessage(ButtonHandle, BM_Click, 0, 0);
          //SendMessage(ButtonHandle,MOUSEEVENTF_LEFTDOWN,0,0);
          //SendMessage(ButtonHandle,MOUSEEVENTF_LEFTUP,0,0);
        end;
      end;  end;
    end;
      //以下代码是为了得到“确定”按钮的句柄end.
      

  6.   

    你的程序多余代码太多,很不直观。第一,代码中既然可以枚举获取“分析”这个按扭的句柄。那么为什么不用枚举获取SysTreeView32的句柄?所以程序稍改进一点,下面的代码就可以省去了:    ///////Begin   获得计算机管理程序TreeView的句柄 
        vHandle   :=   FindWindow('MMCMainFrame',   nil); 
        if   vHandle   =   0   then   Exit; 
        vHandle   :=   FindWindowEx(vHandle,   0,   'MDIClient',   nil); 
        if   vHandle   =   0   then   Exit; 
        vHandle   :=   FindWindowEx(vHandle,   0,   'MMCChildFrm',   nil); 
        if   vHandle   =   0   then   Exit; 
        vHandle   :=   FindWindowEx(vHandle,   0,   'MMCViewWindow',   nil); 
        if   vHandle   =   0   then   Exit; 
        vHandle   :=   FindWindowEx(vHandle,   0,   'SysTreeView32',   nil); 
        if   vHandle   =   0   then   Exit; 
        ///////End   获得计算机管理程序TreeView的句柄 第二,也是最不简洁的地方:function   TreeNodeGetNext(   //   获得下一个节点 
        mHandle:   THandle; 
        mTreeItem:   HTreeItem 
    ):   HTreeItem; 
    var 
        vParentID:   HTreeItem; 
    begin 
        Result   :=   nil; 
        if   (mHandle   <>   0)   and   (mTreeItem   <>   nil)   then 
        begin 
            Result   :=   TreeView_GetChild(mHandle,   mTreeItem); 
            if   Result   =   nil   then 
                Result   :=   TreeView_GetNextSibling(mHandle,   mTreeItem); 
            vParentID   :=   mTreeItem; 
            while   (Result   =   nil)   and   (vParentID   <>   nil)   do 
            begin 
                vParentID   :=   TreeView_GetParent(mHandle,   vParentID); 
                Result   :=   TreeView_GetNextSibling(mHandle,   vParentID); 
            end; 
        end; 
    end;     {   TreeNodeGetNext   } 这个过程根本没有必要去写,把你主程序中的vTreeItem   :=   TreeNodeGetNext(vHandle,   vTreeItem); 这句代码改成发消息,一句就可以了。我换用C++来编写你这个程序,代码极短,生成的EXE极小。
      

  7.   

    第三, 这个循环
    for   I   :=   0   to   vItemCount   -   1   do 
    的意思是获取所有结点,其实可以换种写法便可以节省定义变量,而且连这个TreeView_GetCount(vHandle); 也可以省去了。我的思路是:用While循环获取下个节点,循环条件为判断节点句柄是否为零。你作为新手,以后学习的任务还非常之巨大,祝你好运。