打开“设备管理器”,点击“网络适配器”前边的+号,点击选中“你自己的网卡”,右键选择“停用”
以上的步骤希望用代码实现,实现要求和手动操作一样。
我知道,停用网卡有其它的方法,这里我只想用这种方法实现。
所有的每一步操作,都看得见。
以上的步骤希望用代码实现,实现要求和手动操作一样。
我知道,停用网卡有其它的方法,这里我只想用这种方法实现。
所有的每一步操作,都看得见。
解决方案 »
- 如何在一个Service Application中运行另外一个exe文件
- delphi dbgrid的title标题栏的标题显示能不能换行显示
- Paradox默认值的问题,谁解决全部分给谁.....
- 得已肝三年了,也许在临死前我能做一个全国最优秀的动态构造系统.
- CORBA高高手请进:如何实现Java与Delphi的CORBA互联?
- 分布式数据库的^^^^^^^^^^^^^^^^
- 谁能用Delphi屏蔽Win2000的Alt+Ctrl+Del!分数任你要!!!(UP有分)
- 三层,用DCOM通迅协议,在XP中如何设置DCOM,用Dcomcnfg.exe设置吗,好像没有多少资料介绍在XP下设置DCOM的,
- 哪位大侠可以把下面的代码改成DELPHI的高分相增100分
- delphi 的停靠问题2
- imagelist 在程序中如何增加图片项目?
- 如何将多个文本文件一次性读入SQL数据库
可以给你一个思路,
“设备管理器”可以也就是WINDOWS/SYSTEM32目录下的一个EXE
点击“网络适配器”前边的+号:可以考虑用SEMDMESSAGE来实现
右键停用也是一样。
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分,我也就只说这么多了。
如果需要完整工程,请提供信箱我发给你。
另外楼主要求弹出右键十分不科学,这样导致程序的稳定性降低。2.“启动'devmgmt.msc'最好在桌面进行”改为“启动'devmgmt.msc'最好在虚拟桌面进行”。是虚拟桌面,不是桌面。
你的代码我测试过了,和我要的有一点不同。不同的是,我不想要这一步“鼠标放在设备管理器中,按F5键取得SysTreeView32的句柄”。我想要模拟手动操作的效果,而且每一步都显示出来。
procedure TForm1.FormDestroy(Sender: TObject);
begin
UnRegisterHotKey(Handle, 1);//反注册时的热键id不一定为1
end;
楼主去研究一下netsh命令的用法吧,然后做一个壳来调用。
借用六楼的代码,有一点说明的是你如果有多个网卡的话,自己去找,
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;
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.
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.
通不过的代码如上
能展开网络适配器,但没有禁用成功,倒弹出一个没用的菜单,在左上角
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);
菜单是能弹出的,点那个按钮还不简单?
Application.ProcessMessages;
加上这两句也不行?
ForceForegroundWindow(Form1.mainHnd);
这个加没有
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);
这样就没有问题了,但我有三个网卡,需要作出判断,这个代码要如何实现?
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);
这个帖我先结了,六楼的人私下,给我代码了。
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;