CreateWindowExA/CreateWindowExWへの呼び出しをインターセプトするためにプロキシ DLL を使用しています。一部のアプリケーション (特に一部の Visual Basic 6 アプリケーション) は、2 つの機能のいずれも使用せずにウィンドウを作成できるように見えることを除いて、これはうまく機能します。Spy++のようなツールはウィンドウを表示できますが、フックされた関数はそれらに気づきませんでした。
私の最初の疑いは、おそらくこれらの (古い) アプリケーションはCreateWindowA/CreateWindowWを使用してウィンドウを作成するということでしたが、少なくとも私のコンパイラ (MSVC6 から MSVC10 まで) では、CreateWindow単なる #define; です。ドキュメントの備考セクションはこれを確認します。
私の 2 番目のアイデアは、Windows の作成を検出するためにCBT hookusingをインストールできるかもしれないということでした。SetWindowsHookExただし、結果は同じです。このフックは、フックされた API 関数と同じウィンドウを認識しますが、Spy++ で表示されるすべてのウィンドウを認識するわけではありません。
だから私の質問は: CreateWindowA/CreateWindowWが #define ではなく、実際の関数だった時代があったのでしょうか? user32.dllおそらく互換性の理由から、この関数はまだ によってエクスポートされていますか? この関数のハンドルを取得してフックするにはどうすればよいですか?
または、関数を作成するために使用できる他の、おそらく文書化されていない関数がありNtCreateProcessますCreateProcessか?