C ++从远程控制台应用程序中检索内容

时间:2012-07-31 20:12:06

标签: c++ console hook capture

简介: 我是目前正在使用游戏“Sniper Elite V2”的专用服务器的管理员。 SEV2的专用服务器在控制台应用程序的Windows下运行。我们也可以使用wineHQ在Linux下运行此应用程序。一切都很好,除了控制台在新窗口中启动,因此无法控制台输入/输出(链接:http://img802.imageshack.us/img802/650/sev22.png)。此外,我们可以阅读(使用HEX编辑器)“此程序无法在DOS模式下运行”。我的目标是恢复DOS兼容性。

我的想法是创建另一个用 C ++ 编写的控制台应用程序(使用CodeBlocks)。 这个“Hook”应该检索专用服务器“窗口”的内容(文本)并显示它,当然可以将命令输入到专用服务器控制台。像这样,我们将能够在Windows和Linux上使用输入/输出。 我花时间画了一个小模式:http://img195.imageshack.us/img195/3017/29585679.png

我的问题是:如何做到这一点?我应该使用哪些功能?

此时,我被困住了。我尝试了以下方法:

FUNC“AttachConsole”失败。

以下伪代码也失败了:

mainWindow = FindWindow( TEXT("ConsoleWindowClass"), NULL) );

console = FindWindowEx( mainWindow, NULL, TEXT("ConsoleWindowClass"), NULL );

SendMessage(
  console,
  WM_GETTEXT,
  sizeof(buffer) / sizeof(TCHAR),
  (LPARAM)buffer);

我正在使用名为“WinSpy++”的工具来帮助我,但该工具无法自行检索/输入 Sniper Elite V2专用服务器的数据。

欢迎任何想法/例子/反思: - )

1 个答案:

答案 0 :(得分:1)

  

“此程序无法在DOS模式下运行”

你犯了一个错误。不要混淆术语“DOS模式”和“控制台”。 Windows控制台不是DOS模式。控制台是本机终端,您可以在其中运行为控制台子系统编写的任何32/64位Windows应用程序。 “DOS模式”是Windows之前的操作系统,例如DOS,TR-DOS,FreeDOS等。

至于问题,一个控制台应用程序无法同时使用两个控制台。

<强> UPD

似乎为GUI子系统构建了服务器,并使用AllocConsole创建了控制台。

  1. 使用'CreateProcess'
  2. 运行服务器
  3. 等待一段新的控制台wIndow出现。
  4. 调用'FreeConsole'和'AttachConsole(ServerPID)'
  5. <强>旧

    因此,如果您想从属于console_2的进程中读取console_1,则必须

    1. 启动第三个流程,例如使用DETACHED_PROCESS
    2. 致电FreeConsole(必填)和AttachConsole(RootPidFromConsole_1)
    3. 在第三个进程和console_2的进程(管道,共享内存,......)之间进行通信
    4. 这适用于Windows。