这是否可以挂接子进程发送到 Windows 控制台的消息

is this possible to hook on messages that child process is sending to windows console?

本文关键字:Windows 控制台 消息 子进程 是否      更新时间:2023-10-16

到目前为止,我尝试了SetWindowsHookEx,但似乎它无法从控制台窗口捕获消息。

说明这一点的代码:

#include <iostream>
#define _WIN32_WINNT 0x501
#include <windows.h>
using namespace std;
HHOOK hHook = 0;
LRESULT CALLBACK Callback(int code,WPARAM wParam,LPARAM lParam) { 
  cout << "tick: " << GetTickCount() << ", code: " << code << ", wParam: "
    << wParam << ", lParam: " << lParam << endl;
  return CallNextHookEx(hHook,code,wParam,lParam);
}
int main() {
  int idHook[14] = { WH_CALLWNDPROC, WH_CALLWNDPROCRET, WH_CBT, WH_DEBUG,
    WH_FOREGROUNDIDLE, WH_GETMESSAGE, WH_JOURNALPLAYBACK, WH_JOURNALRECORD,
    WH_KEYBOARD, WH_KEYBOARD_LL, WH_MOUSE, WH_MOUSE_LL, WH_SHELL,
    WH_SYSMSGFILTER };
  for (int i=0 ; i<=14 ; i++) {
    hHook = SetWindowsHookEx( idHook[i] , (HOOKPROC)Callback,
      NULL, GetCurrentThreadId());
  }
  system("dir");
  //here appeared nothing insead `dir` output, but why ?
  system("pause");
  MessageBox(NULL, "Now creating window ...", "... and messages appear.", 0);
}

我查看的另一种方式是控制台本身的 api,特别是ReadConsoleInput()函数。但它不能通过回调工作,因此它只能用于捕获键或鼠标事件。此处的示例代码:http://msdn.microsoft.com/en-us/library/windows/desktop/ms685035%28v=vs.85%29.aspx

但是我需要的是掌握由通过systemCreateProcess创建的进程发出的控制台调用。例如,通过调用,我的意思是在子进程到达我的进程拥有的控制台之前捕获子进程发出的每个printf()

有可能吗?

尝试输出重定向。使用 API CreatePipe创建两个管道对象(一个用于标准输出,另一个用于标准输出),并在调用CreateProcess时将它们传入hStdOutputhStdError STARTUPINFO的成员。子进程输出的任何内容都不会显示,但会通过这些管道;然后,您可以根据需要筛选数据并自行输出。