1

今のところ試してみ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

systemしかし、私が必要としているのは、またはによって作成されたプロセスによって発行されたコンソール呼び出しを把握することですCreateProcessprintf()呼び出しとは、たとえば、プロセスが所有するコンソールに到達する前に、子プロセスによって発行されたすべてをキャッチすることを意味します。

可能性はありますか?

4

1 に答える 1

0

出力リダイレクトを試してください。APIを使用して 2 つのパイプ オブジェクト (1 つは標準出力用、もう 1 つは標準エラー出力用) を作成し、呼び出し時にとのメンバーにCreatePipe渡します。子プロセスの出力は表示されませんが、これらのパイプを通過します。その後、必要に応じてデータをフィルター処理し、自分で出力できます。hStdOutputhStdErrorSTARTUPINFOCreateProcess

于 2012-06-25T13:01:42.273 に答える