首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > .NET >

关于获取其它程序窗口编辑框内容解决思路

2013-04-21 
关于获取其它程序窗口编辑框内容想通过一个小程序获取一个叫“客户信息”窗口中不为空编辑框的内容窗口有四

关于获取其它程序窗口编辑框内容
想通过一个小程序获取一个叫“客户信息”窗口中不为空编辑框的内容
窗口有四个编辑框,请大家指教。
[解决办法]
1.FindWindows 先找主窗体
2.EnumChildWindows 找出所有子窗体
  循环再判一下就成了
[解决办法]
listbox不能这么读啊
要读内存,用下面的函数:

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;

function TreeView_SelectItem_Ex(hwndTV: HWND; slText: TStringList): Boolean;
var
  vItemCount: Integer; 
  vBuffer: array[0..255] of Char; 
  vProcessId: DWORD; 
  vProcess: THandle; 
  vPointer: Pointer; 
  vNumberOfBytesRead: Cardinal;
  I: Integer;
  vItem: TTVItem;//uses CommCtrl
  vTreeItem: HTreeItem;
begin
  Result := False;
  if hwndTV = 0 then exit;
  GetWindowThreadProcessId(hwndTV, @vProcessId); // ?瑕?蝒??餈??ID
  vProcess := OpenProcess(PROCESS_VM_OPERATION or PROCESS_VM_READ or
    PROCESS_VM_WRITE, False, vProcessId);
  if (vProcess = 0) then
    Exit;
  vPointer := VirtualAllocEx(vProcess, nil, 4096, MEM_RESERVE or MEM_COMMIT,
    PAGE_READWRITE);
  if vPointer = nil then exit;
  try
    vItemCount := TreeView_GetCount(hwndTV);


    vTreeItem := TreeView_GetRoot(hwndTV);
    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;

      if not WriteProcessMemory(vProcess, vPointer, @vItem, SizeOf(vItem),
        vNumberOfBytesRead) then break;

      SendMessage(hwndTV, TVM_GETITEM, 0, lparam(vPointer));

      if not ReadProcessMemory(vProcess, Pointer(Cardinal(vPointer)
        + SizeOf(TLVItem)), @vBuffer[0], SizeOf(vBuffer), vNumberOfBytesRead) then
        break;

      slText.Add(vBuffer);
      vTreeItem := TreeNodeGetNext(hwndTV, vTreeItem);
    end; 
  finally 
    VirtualFreeEx(vProcess, vPointer, 0, MEM_RELEASE); 
    CloseHandle(vProcess);
  end;
end;

热点排行