简介: 我是目前正在使用游戏“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专用服务器的数据。
欢迎任何想法/例子/反思: - )
答案 0 :(得分:1)
“此程序无法在DOS模式下运行”
你犯了一个错误。不要混淆术语“DOS模式”和“控制台”。 Windows控制台不是DOS模式。控制台是本机终端,您可以在其中运行为控制台子系统编写的任何32/64位Windows应用程序。 “DOS模式”是Windows之前的操作系统,例如DOS,TR-DOS,FreeDOS等。
至于问题,一个控制台应用程序无法同时使用两个控制台。
<强> UPD 强>
似乎为GUI子系统构建了服务器,并使用AllocConsole创建了控制台。
<强>旧强>
因此,如果您想从属于console_2的进程中读取console_1,则必须
DETACHED_PROCESS
FreeConsole
(必填)和AttachConsole(RootPidFromConsole_1)
这适用于Windows。