这是不是可以挂钩子进程发送到 Windows 控制台的消息?

Posted

技术标签:

【中文标题】这是不是可以挂钩子进程发送到 Windows 控制台的消息?【英文标题】:is this possible to hook on messages that child process is sending to windows console?这是否可以挂钩子进程发送到 Windows 控制台的消息? 【发布时间】:2012-06-25 11:58:48 【问题描述】:

到目前为止,我尝试了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() 到达我的进程拥有的控制台之前捕获它。

这可能吗?

【问题讨论】:

这与不到 24 小时前发布的 your previous question 有何不同? 我想,如果我提供证据证明我在这个问题上花了一些时间,并表明我在询问之前尝试了一些可能性,我最终会得到一个诚实的答案。 (对上一个问题的回答(在你之前)是错误的。) - 我仍在等待可能知道方法的人,也许有一些未记录的可能性。 那么您应该更新现有问题并酌情评论不正确的答案。创建新问题只会造成混乱并降低网站的信噪比。 那么谁会看到我的问题?编辑过的问题会跳到顶部吗? 不,但如果是written properly and tagged correctly,那么人们会看到它。如果他们能回答,他们会的。如果您想在几天后增加曝光率,可以开始bounty。这个网站不是一个论坛。 【参考方案1】:

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

【讨论】:

是的,我知道这种方式,但是连接到管道的某些程序的行为不同,我需要这样做,因为当某些东西尝试向其发送 utf-8 数据时,Windows 控制台会退出,我想捕获这个并使用WriteConsoleW绕过问题 @rsk82 您是说重定向管道时某些假设程序可能无法正常工作吗?这是不合理的。您宁愿使用一些极其丑陋的黑客/未记录的东西来做这件事,以防万一制作不好的程序?你说你正在处理输出。看来您确切地知道它是什么程序。

以上是关于这是不是可以挂钩子进程发送到 Windows 控制台的消息?的主要内容,如果未能解决你的问题,请参考以下文章

13- 钩子

linux查看进程挂掉怎么处理

windows消息钩子注册底层机制浅析

应用SetWinEventHook截获Windows事件

什么是钩子函数?钩子函数的使用。

如何挂钩子视图的子视图?