如何将字符串或信息发送到我在 Delphi 7 中使用 Createprocess 打开的进程

Posted

技术标签:

【中文标题】如何将字符串或信息发送到我在 Delphi 7 中使用 Createprocess 打开的进程【英文标题】:How do I send a string or information to a process I have opened with Createprocess in Delphi 7 【发布时间】:2011-03-30 09:57:24 【问题描述】:

如何将字符串发送到我在 createprocess 的帮助下打开的进程?

借助我在 *** 中找到的内容,我编写了类似的内容:

    var
    StartUpInfo:TStartUpInfo;
    ProcessInfo: TProcessInformation;
    Creationflags: Cardinal;

    FillChar(StartUpInfo, sizeOf(TStartupinfo),0);
    StartUpInfo.cb := SizeOf(StartupInfo);
    Creationflags := NORMAL_PRIORITY_CLASS;

    if Createprocess(nil, Pchar('c:\program files\adobe\reader 9.0\reader\acrord32.exe'
    + ' ' + '/h /O /N /T "c:\ps\test2.pdf" "Generic printer"'),nil, nil,False, 
    creationflags, nil, 0 , StartUpInfo ,  ProcessInfo) then

    begin
      WaitForSingleObject(ProcessInfo.HProcess, infinite);
         begin
           //write some information into the process (a window that opens in 
           //acrobatreader) and then I want to press the enter button            
         end;
      CloseHandle(processinfo.hProcess);

    end;

所以我想要的是在进程完成时(就在waitforsingleobject之后)写一行然后按“enter”按钮,最后在完成时关闭进程。有谁知道如何与外部进程交互?在编程方面,我完全是新手。

最好的问候

【问题讨论】:

【参考方案1】:

您似乎正在尝试以编程方式让 Acrobat Read 打印您的文档。你的问题是,如果它不要求用户交互,你就无法说服它这样做。

您当前的代码无法运行,因为您正在等待进程终止。一旦开始简单地调用 WaitForSingleObject,在进程终止之前,您的任何代码都无法运行。你没有机会让你的代码点击那个按钮。

所以你需要做的是使用不同的等待策略。由于这似乎是一个相当粗略的黑客攻击,我会建议一些我通常不会建议的东西:轮询。而不是无限超时等待,您应该在一个循环中等待超时值,例如 250 毫秒。每次等待终止时,您都会检查进程是否已终止,或者等待是否超时。

当等待超时时,您有机会寻找您要查找的对话窗口。您应该可以使用FindWindowEx() 找到它。您可以使用 Spy++ 发现它的类名。找到对话框窗口后,您需要找到编辑控件的窗口句柄和要单击的按钮:EnumChildWindows() 应该可以解决问题。

一旦您有了想要操作的控件的句柄,您就需要弄清楚如何操作它们。如果幸运的话,如果它是 EDIT 控件或类似控件,您可以通过调用 SetWindowText 来发送字符串。否则你可能不得不伪造按键或者发送一个 WM_PASTE。按钮可能比较麻烦。单击它涉及向按钮父级发送 WM_COMMAND。再次,Spy++ 可以向您显示单击按钮时发送的消息。

当然,当您调用FindWindowEx() 时,您可能找不到您的窗口,因为它还没有显示。发生这种情况时,您会再次调用WaitForSingleObject()

最后,更好的处理方法是使用专用于打印 PDF 的软件库!

【讨论】:

您不需要 WM_Down、WM_KeyPress 和 WM_KeyUp 序列来将击键推送到编辑控件吗?说他想发送一个字符串 @JamesB 好的,我错过了那一点。使用 SetWindowText 可能更容易。【参考方案2】:

你想做什么还不是很清楚。

有几种方法可以将内容发送到进程;

OLE 自动化(例如:MSWord) 通过 CMDLine(例如:notepad file.txt) 通过 STDIN(例如:仅使用 std io 的 cmd 应用) 通过操作(例如:将特定的 wm 消息发送到某个进程窗口)

在我看来,您需要最后一种方法。

基本上,运行正确的 Windows API 函数以从您的进程中获取窗口列表。 然后使用诸如winspy、winspy++之类的程序或带有delphi的程序(忘了它叫什么,它在Delphi工具菜单中)。 使用上述工具找到您要发送消息的窗口的类名,让您的代码过滤掉所有窗口,直到找到这个特定的窗口,然后使用 SendMessage api。

这听起来很复杂,而且(对于初学者来说)。我建议你四处寻找一些教程。该代码使用了 5 个或更多不同的 API 调用,而且我很确定您需要使用回调。

【讨论】:

以上是关于如何将字符串或信息发送到我在 Delphi 7 中使用 Createprocess 打开的进程的主要内容,如果未能解决你的问题,请参考以下文章

应用程序扩展 iOS9:如何将字符串 / URL 从共享视图发送到我的应用程序?

如何将短字符串从 Visual Basic 应用程序发送到 Delphi 应用程序?

Delphi:如何将列表作为参数传递给SQL查询?

Delphi:如何将互联网上的文本文件加载到字符串中?

如何将选定的 uitableview 行发送到新创建的组

如何将崩溃信息从我的 Android 应用程序发送到我的服务器? [复制]