【发布时间】:2013-03-26 17:56:55
【问题描述】:
各位程序员大家好,我在C++程序中遇到了一些控制台应用的问题,我的目标如下。
- 创建第一个 CMD 窗口。
- 执行命令。 (system("打印一些错误文本");)
- 创建第二个 CMD 窗口。
- 将系统(...)焦点更改为第二个 CMD 窗口。
- 执行命令。
- 将系统(...)焦点更改为第一个 CMD 窗口。
- 执行命令。
所有这一切的最终目标是创建一个函数,该函数将由 CMD 应用程序执行,该应用程序将生成另一个 CMD 窗口,在其上执行命令,然后将焦点返回到原始 CMD 窗口以继续执行其他代码。我不需要跟踪窗口,或者能够返回到它。只需创建新窗口,将焦点切换到它,执行命令,将焦点返回到原始窗口。
- 第一个 CMD 窗口在应用程序启动时创建。
- 使用 system(...) 对该窗口执行命令;工作正常。
-
我创建了第二个 CMD 窗口
HWND new_hWnd = NULL; ShellExecute(new_hWnd, "open", "cmd.exe", NULL, NULL, SW_SHOW); - 这是我遇到问题的地方,我无法将 system(...) 重定向到不同的 CMD 窗口,这是我需要帮助的部分,因为如果我能解决这个问题,那么步骤 5, 6 和 7 将很容易完成。
我尝试在网上对此进行研究,并遇到了一些使用“管道”的不同示例,但无法重新创建或理解它们。另外,我注意到有一个
GetConsoleWindow();
返回当前 CMD 窗口句柄的函数,这对我来说有点暗示应该有一种方法可以通过使用句柄在 CMD 窗口之间切换,但是由于我没有将焦点切换到另一个 CMD 窗口,所以我无法调用该函数来获取它的句柄。
那么,如何使 system(...) 使用句柄来定位不同的 CMD 窗口?如果那不可能,我该如何实现这个“管道”系统。
如果解决方案是后者,请尽量详细和简单,因为我在网上找到的每个示例都非常庞大且难以阅读/理解。
如果没有简单的方法来实现“管道”,那么请发帖或指出我最好的(有助于我理解管道如何工作的)示例,您可以找到,我将继续使用它,直到我弄明白.提前谢谢!
【问题讨论】:
-
您不能使用 ShellExecute(..., "cmd", ...) 来定位不同的控制台窗口。请查看 AllocConsole。
-
AllocConsole 对我不起作用,因为要调用它,我首先需要调用 FreeConsole,它会关闭我需要继续运行的初始控制台窗口。两个控制台窗口都需要保持打开状态,原始的和新创建的。