如何将字符串或信息发送到我在 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 从共享视图发送到我的应用程序?