请问,如何从另一个程序窗体里读表填表?

rainfall007 2006-02-16 06:33:17
公司里用lotus notes 5.0
每宗业务里要输入的信息都有很多一样的,可不可以让一个程序检测到什么页面了,就把相应的内容填上去?
主要的页面好象是一个网页一样,里面还有很多的edit控件,listview控件,其他的地方是不可修改的文字.

高手能不能给点提示呢
用什么方法来读取另一个窗体里的有用信息?用hook还是有其他的办法呢?或者给个相近功能的软件源代码看看:)
...全文
268 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
teli_eurydice 2006-02-20
  • 打赏
  • 举报
回复
好像比较麻烦了, 拦截消息看看
cozil 2006-02-20
  • 打赏
  • 举报
回复
如果能通过windows的API GetWindowText取得到更好,实在不行,你只能分析控件存储数据区域的内存格式,当然要用到Hook.楼主有耐心的话就这样做吧。
考虑一下数据的来源,通过截获数据来源分析也是个好办法
rainfall007 2006-02-20
  • 打赏
  • 举报
回复
还有什么方法吗?好象很难弄哦,是他们自己编的控件,是不是真的要用hook
rainfall007 2006-02-18
  • 打赏
  • 举报
回复
谢谢各位,办公电脑在单位里,我这里没有lotusnotes所以现在不好测试.
我的帖子不会忘记给分的,放心:)
另外楼上说直接分析文件的方法应该是不可取的,因为里面的内容都来自数据库.我最好只分析分析客户端.
cozil 2006-02-17
  • 打赏
  • 举报
回复
直接分析其文件格式不是更方便??
RockHwnd 2006-02-17
  • 打赏
  • 举报
回复
另外自己做的控件可能也接受默认的Windows消息,如果不接受那就要查查是什么自定义消息了
RockHwnd 2006-02-17
  • 打赏
  • 举报
回复
只能读取其他窗口里的edit控件的内容,可以用GetWindowText(),但不能读取listview的内容,如果要读取listview的内容要用些特殊的办法

先要根据进程句柄,OpenProcess那个进程,然后VirtualAllocEx,在那个进程里分配内存空间,然后向那个listview发LVM_GETITEM消息,然后再ReadProcessMemory

帖一段网上找来的Delphi的读取listview的代码吧:
(*//
标题:获取其他进程中ListView的文本
说明:Window2000+Delphi6调试通过
设计:Zswang
支持:wjhu111@21cn.com
日期:2004-03-25
//*)

uses CommCtrl;

function ListViewColumnCount(mHandle: THandle): Integer;
begin
Result := Header_GetItemCount(ListView_GetHeader(mHandle));
end; { ListViewColumnCount }

function GetListViewText(mHandle: THandle; mStrings: TStrings): Boolean;
var
vColumnCount: Integer;
vItemCount: Integer;
I, J: Integer;
vBuffer: array[0..255] of Char;
vProcessId: DWORD;
vProcess: THandle;
vPointer: Pointer;
vNumberOfBytesRead: Cardinal;
S: string;
vItem: TLVItem;
begin
Result := False;
if not Assigned(mStrings) then Exit;
vColumnCount := ListViewColumnCount(mHandle);
if vColumnCount <= 0 then Exit;
vItemCount := ListView_GetItemCount(mHandle);
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);
mStrings.BeginUpdate;
try
mStrings.Clear;
for I := 0 to vItemCount - 1 do begin
S := '';
for J := 0 to vColumnCount - 1 do begin
with vItem do begin
mask := LVIF_TEXT;
iItem := I;
iSubItem := J;
cchTextMax := SizeOf(vBuffer);
pszText := Pointer(Cardinal(vPointer) + SizeOf(TLVItem));
end;
WriteProcessMemory(vProcess, vPointer, @vItem,
SizeOf(TLVItem), vNumberOfBytesRead);
SendMessage(mHandle, LVM_GETITEM, I, lparam(vPointer));
ReadProcessMemory(vProcess, Pointer(Cardinal(vPointer) + SizeOf(TLVItem)),
@vBuffer[0], SizeOf(vBuffer), vNumberOfBytesRead);
S := S + #9 + vBuffer;
end;
Delete(S, 1, 1);
mStrings.Add(S);
end;
finally
VirtualFreeEx(vProcess, vPointer, 0, MEM_RELEASE);
CloseHandle(vProcess);
mStrings.EndUpdate;
end;
Result := True;
end; { GetListViewText }

//Example
procedure TForm1.FormCreate(Sender: TObject);
begin
RegisterHotKey(Handle, 1, MOD_WIN, VK_F2);
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
UnRegisterHotKey(Handle, 1);
end;

procedure TForm1.WMHOTKEY(var Msg: TWMHOTKEY);
begin
case Msg.HotKey of
1:
GetListViewText(
WindowFromPoint(Point(Mouse.CursorPos.X, Mouse.CursorPos.Y)),
MemoText.Lines);
end;
end;

rainfall007 2006-02-17
  • 打赏
  • 举报
回复
我今天查了一下,本来以为是edit 和list 其实并不是,我用spy++看到的类名是IRIS.tedit和NotesLineView
象这样的他们自己做的控件怎么办呢?
pomelowu 2006-02-16
  • 打赏
  • 举报
回复
有些地方的不可修改的信息
看看是怎么显式出来的。如果是static之类的控件,也可以类似处理。
rainfall007 2006-02-16
  • 打赏
  • 举报
回复
edit控件应该是可以得到内容的,有些地方的不可修改的信息,像网页一样的,怎么得到内容呢.
我会继续试试的
pomelowu 2006-02-16
  • 打赏
  • 举报
回复
获得每个控件的HWND,用GetWindowText和SetWindowText试试看先

16,550

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Creator Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧