打开“设备管理器”,点击“网络适配器”前边的+号,点击选中“你自己的网卡”,右键选择“停用”
以上的步骤希望用代码实现,实现要求和手动操作一样。
我知道,停用网卡有其它的方法,这里我只想用这种方法实现。
所有的每一步操作,都看得见。

解决方案 »

  1.   

    我帮你顶,这个说难不驻,说简单也不简单,要找到现成的代码有点因难,但也许可以一步一步地去找寻相关代码。
    可以给你一个思路,
    “设备管理器”可以也就是WINDOWS/SYSTEM32目录下的一个EXE
    点击“网络适配器”前边的+号:可以考虑用SEMDMESSAGE来实现
    右键停用也是一样。
      

  2.   

    执行这句可启动设备管理器:ShellExecute(0,0,'devmgmt.msc',0,0,1);下面的代码实现当设备管理器已经启动后,鼠标放在设备管理器中,按F5键取得SysTreeView32的句柄,然后由句柄实现你所要的功能:
    unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs,COMMCTRL, StdCtrls;type
      TForm1 = class(TForm)
        procedure FormCreate(Sender: TObject);
        procedure FormDestroy(Sender: TObject);
      private
        { Private declarations }
        procedure WMHotKey(var msg:TMessage);message WM_hotkey;
      public
        { Public declarations }
      end;var
      Form1: TForm1;implementation{$R *.dfm}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;
    function GetTreeViewText(mHandle: THandle): Boolean;
    var
      vItemCount: Integer;
      vBuffer: array[0..255] of Char;
      vProcessId: DWORD;
      vProcess: THandle;
      vPointer: Pointer;
      vNumberOfBytesRead: Cardinal;
      I: Integer;
      vItem: TTVItem;
      vTreeItem: HTreeItem;
    begin
      Result := False;
      GetWindowThreadProcessId(mHandle, @vProcessId);
      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(mHandle);
        vTreeItem := TreeView_GetRoot(mHandle);
        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(mHandle, TVM_GETITEM, 0, lparam(vPointer));
          ReadProcessMemory(vProcess, Pointer(Cardinal(vPointer) + SizeOf(TLVItem)),
            @vBuffer[0], SizeOf(vBuffer), vNumberOfBytesRead);
          vTreeItem := TreeNodeGetNext(mHandle, vTreeItem);
          IF lstrcmpi(vBuffer,'网络适配器')=0 then
            begin
              SendMessage(mHandle,   TVM_SELECTITEM,   TVGN_CARET,   Integer(vTreeItem));
              keybd_event(93, 0, 0, 0);
              keybd_event(93, 0, KEYEVENTF_KEYUP, 0);
            //  sleep(200);//加上此句,可以看到菜单弹出效果。
              keybd_event(68, 0, 0, 0);
              keybd_event(68, 0, KEYEVENTF_KEYUP, 0);
              break;
            end;
        end;
      finally
        VirtualFreeEx(vProcess, vPointer, 0, MEM_RELEASE);
        CloseHandle(vProcess);
      end;
      Result := True;
    end;
    procedure TForm1.FormCreate(Sender: TObject);
    begin
      RegisterHotKey(handle,GlobalAddAtom('MyHotkey')- $C000,0,VK_F5);
    end;procedure TForm1.FormDestroy(Sender: TObject);
    begin
      UnRegisterHotKey(Handle, 1);
    end;procedure Tform1.WMHotKey(var msg: TMessage);
    begin
      GetTreeViewText(WindowFromPoint(Point(Mouse.CursorPos.X, Mouse.CursorPos.Y)));
    end;
    end.现在还有两个问题:
    1.关于句柄获取我是用鼠标来获取的,楼主可以将它改为自动启动'devmgmt.msc'后遍历窗口来获取。
    2.最后会弹出一个确实提示,楼主说了,直接点“是”。这个不难实现,楼主自己应该可以写出来吧?我这里只是写出了关键代码。另外的2点建议:
        1.用鼠标右键弹出一个快捷菜单,必须要保证设备管理器处于当前活动状态,这显然不爽。但楼主要求必须这样做,我也就照做了。其实有另一种方法就是直接模拟菜单输入,程序在选中网卡后,自动点击主菜单“操作”里面的“禁用”,这样无论设备管理器是否为当前窗口,都可以实现。不会影响用户正确使用计算机干其它的事。
        2.启动'devmgmt.msc'最好在桌面进行,这样更佳,不会出现窗口就直接禁用了网卡,更爽。
    签于楼主只给了200分,我也就只说这么多了。
    如果需要完整工程,请提供信箱我发给你。
      

  3.   

    上述两点建议里有两个错别字,更正一下:1.“不会影响用户正确使用计算机干其它的事。”改为“不会影响用户正常使用计算机干其它的事。”,是正常,不是正确。
    另外楼主要求弹出右键十分不科学,这样导致程序的稳定性降低。2.“启动'devmgmt.msc'最好在桌面进行”改为“启动'devmgmt.msc'最好在虚拟桌面进行”。是虚拟桌面,不是桌面。
      

  4.   

    你好,糖果兄!
    你的代码我测试过了,和我要的有一点不同。不同的是,我不想要这一步“鼠标放在设备管理器中,按F5键取得SysTreeView32的句柄”。我想要模拟手动操作的效果,而且每一步都显示出来。
      

  5.   

    致敬6楼的:里面有段代码可能由于楼主写的太快没注意.
    procedure TForm1.FormDestroy(Sender: TObject);
    begin
      UnRegisterHotKey(Handle, 1);//反注册时的热键id不一定为1
    end;
      

  6.   

    netsh interface set interface 本地连接1 disabled
    楼主去研究一下netsh命令的用法吧,然后做一个壳来调用。
      

  7.   

    楼主可以去查一下ADSL拨号的代码,记得有函数可以直接关网卡,只要例出网卡设配号就行了
      

  8.   

    很简单
    借用六楼的代码,有一点说明的是你如果有多个网卡的话,自己去找,
    unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs,shellapi, StdCtrls,COMMCTRL;type
      TForm1 = class(TForm)
        Button1: TButton;
        Memo1: TMemo;
        Button2: TButton;
        procedure Button1Click(Sender: TObject);
        procedure Button2Click(Sender: TObject);
      private
        mainHnd:Cardinal;
        { Private declarations }  public
        { Public declarations }
      end;var
      Form1: TForm1;implementation{$R *.dfm}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;function ForceForegroundWindow(hwnd: THandle): boolean;
    const
       SPI_GETFOREGROUNDLOCKTIMEOUT = $2000;
       SPI_SETFOREGROUNDLOCKTIMEOUT = $2001;
    var
       timeout: DWORD;
    begin
       if ((Win32Platform = VER_PLATFORM_WIN32_NT) and (Win32MajorVersion > 4)) or
          ((Win32Platform = VER_PLATFORM_WIN32_WINDOWS) and
          ((Win32MajorVersion > 4) or ((Win32MajorVersion = 4) and
          (Win32MinorVersion > 0)))) then
       begin
         SystemParametersInfo(SPI_GETFOREGROUNDLOCKTIMEOUT, 0, @TimeOut, 0);
         SystemParametersInfo(SPI_SETFOREGROUNDLOCKTIMEOUT, 0, Pointer(0), SPIF_SENDCHANGE);
         Result := SetForegroundWindow(hWnd);
         SystemParametersInfo(SPI_SETFOREGROUNDLOCKTIMEOUT, 0,Pointer(TimeOut), SPIF_SENDCHANGE);
       end
       else
         Result := SetForegroundWindow(hWnd);
    end; { ForceForegroundWindow }
    function GetTreeViewText(mHandle: THandle): Boolean;
    var
      vItemCount: Integer;
      vBuffer: array[0..255] of Char;
      vProcessId: DWORD;
      vProcess: THandle;
      vPointer: Pointer;
      vNumberOfBytesRead: Cardinal;
      I: Integer;
      vItem: TTVItem;
      vTreeItem: HTreeItem;
    begin
      Result := False;
      GetWindowThreadProcessId(mHandle, @vProcessId);
      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(mHandle);
        vTreeItem := TreeView_GetRoot(mHandle);
        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(mHandle, TVM_GETITEM, 0, lparam(vPointer));
          ReadProcessMemory(vProcess, Pointer(Cardinal(vPointer) + SizeOf(TLVItem)),
            @vBuffer[0], SizeOf(vBuffer), vNumberOfBytesRead);
          vTreeItem := TreeNodeGetNext(mHandle, vTreeItem);
          IF lstrcmpi(vBuffer,'网络适配器')=0 then
            begin
              ShowWindow(Form1.mainHnd,1);
              ForceForegroundWindow(Form1.mainHnd);
              sleep(100);
              Application.ProcessMessages;
              SendMessage(mHandle,   TVM_SELECTITEM,   TVGN_CARET,   Integer(vTreeItem));
              sleep(1000);
              Application.ProcessMessages;
              keybd_event(93, 0, 0, 0);
              keybd_event(93, 0, KEYEVENTF_KEYUP, 0);
              sleep(1500);//加上此句,可以看到菜单弹出效果。
              keybd_event(68, 0, 0, 0);
              keybd_event(68, 0, KEYEVENTF_KEYUP, 0);
              break;
            end
          else
            Form1.Memo1.Lines.Add(vBuffer);
        end;
      finally
        VirtualFreeEx(vProcess, vPointer, 0, MEM_RELEASE);
        CloseHandle(vProcess);
      end;
      Result := True;
    end;
      

  9.   

    procedure TForm1.Button1Click(Sender: TObject);
    var
      sonHnd,whnd:Cardinal;
      s:string ;
    begin
      mainHnd:=0;
      s:='1234';
      //ShellExecute(0,0,'devmgmt.msc',0,0,1);
      while mainHnd=0 do
      begin
        mainHnd:=FindWindow(nil,'设备管理器');
      end;
      showmessage(inttostr(mainhnd));
      if mainhnd<>0 then
      begin
        whnd:=FindWindowEx(mainHnd,0,'MDIClient',nil);
        whnd:=FindWindowEx(whnd,0,'MMCChildFrm',nil);
        whnd:=FindWindowEx(whnd,0,'MMCViewWindow',nil);
        whnd:=FindWindowEx(whnd,0,'MMCOCXViewWindow',nil);
        whnd:=FindWindowEx(whnd,0,'AtlAxWinEx',nil);
        whnd:=FindWindowEx(whnd,0,'AfxOleControl42u',nil);
        sonhnd:=findwindowex(whnd,0,'SysTreeView32',nil);    if sonhnd<>0 then
        begin
          GetTreeViewText(sonHnd);
          //sendmessage(sonhnd,wm_settext,20,lparam(s));
          //SendMessage(FButtonHandle,WM_LBUTTONDOWN,0,0);
          //endMessage(FButtonHandle,WM_LBUTTONUP,0,0);
        end;
      end;
    end;procedure TForm1.Button2Click(Sender: TObject);
    begin
      ShellExecute(0,0,'devmgmt.msc',0,0,1);
    end;end.
    unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs,shellapi, StdCtrls,COMMCTRL;type
      TForm1 = class(TForm)
        Button1: TButton;
        Memo1: TMemo;
        Button2: TButton;
        procedure Button1Click(Sender: TObject);
        procedure Button2Click(Sender: TObject);
      private
        mainHnd:Cardinal;
        { Private declarations }  public
        { Public declarations }
      end;var
      Form1: TForm1;implementation{$R *.dfm}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;function ForceForegroundWindow(hwnd: THandle): boolean;
    const
       SPI_GETFOREGROUNDLOCKTIMEOUT = $2000;
       SPI_SETFOREGROUNDLOCKTIMEOUT = $2001;
    var
       timeout: DWORD;
    begin
       if ((Win32Platform = VER_PLATFORM_WIN32_NT) and (Win32MajorVersion > 4)) or
          ((Win32Platform = VER_PLATFORM_WIN32_WINDOWS) and
          ((Win32MajorVersion > 4) or ((Win32MajorVersion = 4) and
          (Win32MinorVersion > 0)))) then
       begin
         SystemParametersInfo(SPI_GETFOREGROUNDLOCKTIMEOUT, 0, @TimeOut, 0);
         SystemParametersInfo(SPI_SETFOREGROUNDLOCKTIMEOUT, 0, Pointer(0), SPIF_SENDCHANGE);
         Result := SetForegroundWindow(hWnd);
         SystemParametersInfo(SPI_SETFOREGROUNDLOCKTIMEOUT, 0,Pointer(TimeOut), SPIF_SENDCHANGE);
       end
       else
         Result := SetForegroundWindow(hWnd);
    end; { ForceForegroundWindow }
    function GetTreeViewText(mHandle: THandle): Boolean;
    var
      vItemCount: Integer;
      vBuffer: array[0..255] of Char;
      vProcessId: DWORD;
      vProcess: THandle;
      vPointer: Pointer;
      vNumberOfBytesRead: Cardinal;
      I: Integer;
      vItem: TTVItem;
      vTreeItem: HTreeItem;
    begin
      Result := False;
      GetWindowThreadProcessId(mHandle, @vProcessId);
      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(mHandle);
        vTreeItem := TreeView_GetRoot(mHandle);
        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(mHandle, TVM_GETITEM, 0, lparam(vPointer));
          ReadProcessMemory(vProcess, Pointer(Cardinal(vPointer) + SizeOf(TLVItem)),
            @vBuffer[0], SizeOf(vBuffer), vNumberOfBytesRead);
          vTreeItem := TreeNodeGetNext(mHandle, vTreeItem);
          IF lstrcmpi(vBuffer,'网络适配器')=0 then
            begin
              ShowWindow(Form1.mainHnd,1);
              ForceForegroundWindow(Form1.mainHnd);
              sleep(100);
              Application.ProcessMessages;
              SendMessage(mHandle,   TVM_SELECTITEM,   TVGN_CARET,   Integer(vTreeItem));
              sleep(1000);
              Application.ProcessMessages;
              keybd_event(93, 0, 0, 0);
              keybd_event(93, 0, KEYEVENTF_KEYUP, 0);
              sleep(1500);//加上此句,可以看到菜单弹出效果。
              keybd_event(68, 0, 0, 0);
              keybd_event(68, 0, KEYEVENTF_KEYUP, 0);
              break;
            end
          else
            Form1.Memo1.Lines.Add(vBuffer);
        end;
      finally
        VirtualFreeEx(vProcess, vPointer, 0, MEM_RELEASE);
        CloseHandle(vProcess);
      end;
      Result := True;
    end;procedure TForm1.Button1Click(Sender: TObject);
    var
      sonHnd,whnd:Cardinal;
      s:string ;
    begin
      mainHnd:=0;
      s:='1234';
      //ShellExecute(0,0,'devmgmt.msc',0,0,1);
      while mainHnd=0 do
      begin
        mainHnd:=FindWindow(nil,'设备管理器');
      end;
      showmessage(inttostr(mainhnd));
      if mainhnd<>0 then
      begin
        whnd:=FindWindowEx(mainHnd,0,'MDIClient',nil);
        whnd:=FindWindowEx(whnd,0,'MMCChildFrm',nil);
        whnd:=FindWindowEx(whnd,0,'MMCViewWindow',nil);
        whnd:=FindWindowEx(whnd,0,'MMCOCXViewWindow',nil);
        whnd:=FindWindowEx(whnd,0,'AtlAxWinEx',nil);
        whnd:=FindWindowEx(whnd,0,'AfxOleControl42u',nil);
        sonhnd:=findwindowex(whnd,0,'SysTreeView32',nil);    if sonhnd<>0 then
        begin
          GetTreeViewText(sonHnd);
          //sendmessage(sonhnd,wm_settext,20,lparam(s));
          //SendMessage(FButtonHandle,WM_LBUTTONDOWN,0,0);
          //endMessage(FButtonHandle,WM_LBUTTONUP,0,0);
        end;
      end;
    end;procedure TForm1.Button2Click(Sender: TObject);
    begin
      ShellExecute(0,0,'devmgmt.msc',0,0,1);
    end;end.
      

  10.   


    unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs,shellapi, StdCtrls,COMMCTRL;type
      TForm1 = class(TForm)
      Button1: TButton;
      procedure Button1Click(Sender: TObject);
      private
      mainHnd:Cardinal;
      { Private declarations }  public
      { Public declarations }
      end;var
      Form1: TForm1;implementation{$R *.dfm}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;
    function GetTreeViewText(mHandle: THandle): Boolean;
    var
      vItemCount: Integer;
      vBuffer: array[0..255] of Char;
      vProcessId: DWORD;
      vProcess: THandle;
      vPointer: Pointer;
      vNumberOfBytesRead: Cardinal;
      I: Integer;
      vItem: TTVItem;
      vTreeItem: HTreeItem;
    begin
      GetWindowThreadProcessId(mHandle, @vProcessId);
      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(mHandle);
        vTreeItem := TreeView_GetRoot(mHandle);
        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(mHandle, TVM_GETITEM, 0, lparam(vPointer));
          ReadProcessMemory(vProcess, Pointer(Cardinal(vPointer) + SizeOf(TLVItem)),
            @vBuffer[0], SizeOf(vBuffer), vNumberOfBytesRead);
          vTreeItem := TreeNodeGetNext(mHandle, vTreeItem);
          IF lstrcmpi(vBuffer,'网络适配器')=0 then
            begin
              SendMessage(mHandle,   TVM_SELECTITEM,   TVGN_CARET,   Integer(vTreeItem));
              keybd_event(93, 0, 0, 0);
              keybd_event(93, 0, KEYEVENTF_KEYUP, 0);
              sleep(200);//加上此句,可以看到菜单弹出效果。
              keybd_event(68, 0, 0, 0);
              keybd_event(68, 0, KEYEVENTF_KEYUP, 0);
              break;
            end;
        end;
      finally
        VirtualFreeEx(vProcess, vPointer, 0, MEM_RELEASE);
        CloseHandle(vProcess);
      end;
      Result := True;
    end;procedure TForm1.Button1Click(Sender: TObject);
    var
      sonHnd,whnd:Cardinal;
     // s:string ;
    begin
      mainHnd:=0;
      //s:='VMware';
      ShellExecute(handle,nil,'devmgmt.msc',nil,nil,1);
      sleep(2000);
      while mainHnd=0 do
      begin
      mainHnd:=FindWindow(nil,'设备管理器');
      end;
      if mainhnd<>0 then
      begin
      whnd:=FindWindowEx(mainHnd,0,'MDIClient',nil);
      whnd:=FindWindowEx(whnd,0,'MMCChildFrm',nil);
      whnd:=FindWindowEx(whnd,0,'MMCViewWindow',nil);
      whnd:=FindWindowEx(whnd,0,'MMCOCXViewWindow',nil);
      whnd:=FindWindowEx(whnd,0,'AtlAxWinEx',nil);
      whnd:=FindWindowEx(whnd,0,'AfxOleControl42u',nil);
      sonhnd:=findwindowex(whnd,0,'SysTreeView32',nil);  if sonhnd<>0 then
      begin
      GetTreeViewText(sonHnd);
      end;
      end;
    end;
    end.
    通不过的代码如上
    能展开网络适配器,但没有禁用成功,倒弹出一个没用的菜单,在左上角
      

  11.   

    呵呵,看来你还是没有完全看清我的代码,
    sleep(1000);
      Application.ProcessMessages;
      keybd_event(93, 0, 0, 0);
      keybd_event(93, 0, KEYEVENTF_KEYUP, 0);
      sleep(1500);//加上此句,可以看到菜单弹出效果。
      keybd_event(68, 0, 0, 0);
      keybd_event(68, 0, KEYEVENTF_KEYUP, 0);
    菜单是能弹出的,点那个按钮还不简单?
      

  12.   

    sleep(1000);
      Application.ProcessMessages;
    加上这两句也不行?
      

  13.   

    ShowWindow(Form1.mainHnd,1);
    ForceForegroundWindow(Form1.mainHnd);
    这个加没有
      

  14.   

    经qq好友指导成这样
    SendMessage(mHandle,   TVM_SELECTITEM,   TVGN_CARET,   Integer(vTreeItem));
              keybd_event(9, 0, 0, 0);
              keybd_event(9, 0, KEYEVENTF_KEYUP, 0); //TAB
              keybd_event(93, 0, 0, 0);
              keybd_event(93, 0, KEYEVENTF_KEYUP, 0);
              这样就没有问题了,但我有三个网卡,需要作出判断,这个代码要如何实现?
      

  15.   

    主要是焦点没有在systreeview32上,可以模拟点一哈
      ShowWindow(Form1.mainHnd,1);
      ForceForegroundWindow(Form1.mainHnd);
      sleep(1000);
      SendMessage(mHandle,WM_LBUTTONDBLCLK,0,0);
      Application.ProcessMessages;
      SendMessage(mHandle,   TVM_SELECTITEM,   TVGN_CARET,   Integer(vTreeItem));
      sleep(1000);
      Application.ProcessMessages;
      keybd_event(93, 0, 0, 0);
      

  16.   

    caocs_dn我会另外给你分的,如果你要的话
    这个帖我先结了,六楼的人私下,给我代码了。
      

  17.   

    代码我早在6楼已经贴出来了。而且那个代码是没有错误的关键代码。私下发给你的代码,只是帮你解决多个网卡选择的问题。而且是在你的源码基础上做改动的代码。现在继续贴出来:
    function GetTreeViewText(mHandle: THandle;x:integer): Boolean;
    var
      vItemCount: Integer;
      vBuffer: array[0..255] of Char;
      vProcessId: DWORD;
      vProcess: THandle;
      vPointer: Pointer;
      vNumberOfBytesRead: Cardinal;
      I,j: Integer;
      vItem: TTVItem;
      vTreeItem: HTreeItem;
    begin
      GetWindowThreadProcessId(mHandle, @vProcessId);
      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(mHandle);
        vTreeItem := TreeView_GetRoot(mHandle);
        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(mHandle, TVM_GETITEM, 0, lparam(vPointer));
          ReadProcessMemory(vProcess, Pointer(Cardinal(vPointer) + SizeOf(TLVItem)),
            @vBuffer[0], SizeOf(vBuffer), vNumberOfBytesRead);
          vTreeItem := TreeNodeGetNext(mHandle, vTreeItem);
          IF lstrcmpi(vBuffer,'网络适配器')=0 then
            begin
              for j:=2 to form1.SpinEdit1.Value do vTreeItem := TreeNodeGetNext(mHandle, vTreeItem);//关键在这里。
              SetForegroundWindow(mHandle);
              SendMessage(mHandle,   TVM_SELECTITEM,   TVGN_CARET,   Integer(vTreeItem));
              keybd_event(93, 0, 0, 0);
              keybd_event(93, 0, KEYEVENTF_KEYUP, 0);
              break;
            end;
        end;
      finally
        VirtualFreeEx(vProcess, vPointer, 0, MEM_RELEASE);
        CloseHandle(vProcess);
      end;
      Result := True;
    end;