如题

解决方案 »

  1.   

    大概是这样:
    procedure TForm1.Button1Click(Sender: TObject);
    begin
      SendMessage(TreeView1.Handle, WM_LBUTTONDOWN, MK_LBUTTON, MakeLong(40, 7));
      SendMessage(TreeView1.Handle, WM_LBUTTONUP, MK_LBUTTON, MakeLong(40, 7));
    end;如何确定是哪个节点?
      

  2.   

    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}
      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;
    begin
      //以下代码是为了得到“确定”按钮的句柄
      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.现在必须要手动点一下磁盘碎片整理程序,才能执行点击分析按钮,我想在点分析之前,先点击磁盘碎片整理程序一下。
      

  3.   

    参考如下代码,XP下测试成功
    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 }procedure TForm1.Button1Click(Sender: TObject);
    var
      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);
      end;
    end;