c++ - 是否可以 Hook 子进程发送到 Windows 控制台的消息?

标签 c++ windows winapi console hook

截至目前,我尝试了 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()

这有可能吗?

最佳答案

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

关于c++ - 是否可以 Hook 子进程发送到 Windows 控制台的消息?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11188937/

相关文章:

c++ - 为什么不能从 C++11 中的非限定成员函数名中获取指向成员的指针?

c++ - 使用 cpprestsdk 和 boost 固定证书

javascript - 显示用户提交的图像

node.js - 在CMD中设置多个PATH变量

c++ - 包含 boost/optional.hpp 时出现 C2143 语法错误

c++ - 全局 vector 在C++程序结尾导致段错误

windows - 如何在 Windows 上使用 GUI 添加或删除 git 标签?

c++ - 在 C++ 中使用 WriteProcessMemory() 与多级指针和偏移量?

c# - 使用 Windows 键盘 Hook 时,在键盘状态下错误检测到 SHIFT 键

c++ - "UWP"和 "Immersive"app 是同一个东西吗?如果不是,有什么区别?