获取程序之外的Delphi文本字段的值

Leo*_*Leo 0 delphi winapi

希望有人可能会指出我正确的方向.

所以在计算机上运行一个非常简单和旧的Delphi程序,我无法访问源或它的数据库.我只能运行.exe

我想以某种方式从这个程序中的TEdit控件读取几个字符串并将它们转储到同一台计算机上的简单.txt文件中.它还会在每次出现新内容时打印数据,因此可能有一种方法可以在发送到打印机时捕获它.这是我的想法结束的地方.

我该怎么做呢?某种听众效用?Win32 API?操作系统是Win7.

PS这不是黑客攻击:)所以不需要隐藏任何东西.可以在视线范围内.

编辑:好的,既然每个人都开始专注于错误的事情,我会尽力解释我需要的东西.

首先,编程是"唯一的"我的一个开关业余爱好.我仍然认为自己是一个初学者.但是之前我只是拿了一本大书,比如C语言并阅读它,没有完成任何事情,并且让生活受到阻碍,现在我已经决定了一个更好的方法就是拥有一个牢记具体项目,并以此为重点.这样我就会有一个特定的目标,并会尝试只学习实现它所需要的东西和技术.它还将帮助我克服混淆哪种语言/技术的挑剔.

这就是我的问题所在.我的实际工作与编程或IT无关.我们在使用的软件中也没有任何访问权限或任何发言权.其中一个程序 - 我正在谈论的程序 - 是一个简单的寄存器:客户端来了,我们的员工在寄存器中添加了一个条目,程序打印出来(因此我认为我可以在发送到打印机时捕获信息)两个带有号码的收据.一个去客户,另一个和我们在一起.我们有一个非常原始的系统,允许客户使用他的收据号码查询他的订单状态(基本上是"完成"或"未完成").信息存储在我们网站上的小型数据库中.我有机会获得我们的数据库和我们的信息.我没有任何访问注册程序源的资源,也没有访问它的DB.我也不能修改.我只能运行它.因此问题.

我们现在所做的是 - 一名员工随后拿起那张纸,打开我们的网站并手动添加新条目.然后,当时机成熟时,他会改变其状态.我的想法是简化每个人的生活:以某种方式捕获收据号(和其他信息)在Delphi注册程序的条目创建过程中(当客户端仍然存在时,在我们的员工点击"确定"并创建条目之前),转储它是一个.txt文件,后来开发了一些东西来自动将信息批量上传到我们自己的数据库.所以没有人必须手工输入,这是毫无意义和乏味的.问题是,就像我说的那样,我无法访问程序的源代码或数据库.这是一个事实,没有必要建议我们改变这个事实.我们做不到.我可以访问程序运行的物理计算机,当然我可以访问我们的网站和我们的数据库.希望这是有道理的.

同样,我的工作与IT无关,所以这将是一个自由时间的爱好项目,让我回到编程,但有一个特定的目标.这似乎是一个崇高的目标,但我没有其他想法诚实.这就是为什么我说我准备好考虑任何技术和任何语言.Delphi只是因为注册软件是Delphi而被标记.我实际上对Delphi知之甚少,所以如果可以用其他语言(C或.Net或某种类型的脚本......)来完成,我会很感激指针.

Fre*_*edS 5

我一直这样做基本上自动化XP上的一个非常古老的应用程序.这是从2000年开始,仅用于XP.

  • 使用Spy或EnumWindows获取FindWindow所需的数据,以便将正确的句柄返回到文本框
  • 然后使用带有AttachThreadInput和WM_GETTEXT的SendMessage
  • 在Thread内运行,定期探测文本字段

如果它需要防弹,那么看看Hooks,madCodeHook很容易,但你需要证明你没有做任何好的黑客在前五分钟从他的伙伴那里学到的东西.

一些代码可以帮助您入门:

function MySendMessageEx(const handle: THandle; const MessageID: Cardinal; const wParam, lParam: integer): integer;
var
  ThisThreadID      : DWord;
  AttachToThreadID  : DWord;
begin
  ThisThreadID := GetCurrentThreadID;
  AttachToThreadID := GetWindowThreadProcessId(handle, nil);
  Result := 0;
  if ThisThreadID <> AttachToThreadID then
  begin
    if AttachThreadInput(ThisThreadID, AttachToThreadID, True) then
    try
      Result := SendMessage(handle, MessageID, wParam, lParam);
    finally
      AttachThreadInput(ThisThreadID, AttachToThreadID, false);
    end;
  end;
end;
Run Code Online (Sandbox Code Playgroud)

和:

  SetString(Result, Buffer, MySendMessageEx(AHandle, WM_GETTEXT, SizeOf(Buffer), Integer(@Buffer)));
Run Code Online (Sandbox Code Playgroud)

  • 我不会使用`UIntPtr`!.始终使用(C)原件使用的类型/名称,如"DWORD","WPARAM","LPARAM"等.这样可确保您以后不必更改任何内容.如果它们发生变化,这些定义也将在运行时单元中更改.不要进一步翻译它们. (3认同)