如题
解决方案 »
- 请教:XML文件中的记录,项的数目不一样,是否可以正常操作?
- 用DELPHI7做单机版用的小型信息记录软件,用interbase库好还是ACCESS好?
- delphi 调用WebService 时参数太多
- 一个关于类的小小问题,希望各位大虾能帮我解决(在线等待)
- 高分求rxlib for delphi6控件(特急)
- 如何为Image控件加一个例似于UpDown的东东,当窗体放不下图片时,可以滚动显示!!
- 哪有比较好的浏览DLL的工具?
- 大家习惯用TQuery还是TTable?
- cobol还有没有人用?
- 我用Delphi 的DCom+ADO怎么不可以更新呢
- dll中使用TreeView出現問題,請求解決
- 关于 DoubleBuffered
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;如何确定是哪个节点?
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.现在必须要手动点一下磁盘碎片整理程序,才能执行点击分析按钮,我想在点分析之前,先点击磁盘碎片整理程序一下。
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;