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%”的时候,然后做一些事情,比如关机?
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%”的时候,然后做一些事情,比如关机?
mwy6544321
我的qq:44665376
你能加我吗?
我的qq:44665376
而非窗口标题
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.
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极小。
for I := 0 to vItemCount - 1 do
的意思是获取所有结点,其实可以换种写法便可以节省定义变量,而且连这个TreeView_GetCount(vHandle); 也可以省去了。我的思路是:用While循环获取下个节点,循环条件为判断节点句柄是否为零。你作为新手,以后学习的任务还非常之巨大,祝你好运。